【问题标题】:How to implement in-memory logger for last 100 log lines?如何为最后 100 个日志行实现内存记录器?
【发布时间】:2011-10-28 07:20:38
【问题描述】:

如何制作只存储最后 100 个条目的高效内存日志,并且可以快速将结果字符串输出到 TextBox(每次更新时)

我正在使用File.AppendAllText 对文本文件进行实际记录,但希望能够查看我的应用程序中的最后一个条目。

【问题讨论】:

    标签: c# .net wpf string logging


    【解决方案1】:

    你看过Log4Net吗?

    更具体地说是 log4net.Appender.MemoryAppender

    【讨论】:

    • 我们已经有日志系统帽子不提供这样的功能。而且我们不能为这个单一的函数引入新的依赖。
    • 您使用的不是 log4net 吗?介意我问什么?
    【解决方案2】:

    一个简单的队列有什么问题:

    Queue<string> _items = new Queue<string>();
    
    public void WriteLog(string value)
    {
        _items.Enqueue(value);
        if(_items.Count > 100)
            _items.Dequeue();
    }
    

    【讨论】:

    • 在 TextBox 中显示的所有 100 个字符串的连接将非常昂贵,我在每次日志更新时都需要它
    • 比什么贵?什么费用太多了?只是一个意见,但对于诊断工具来说,几毫秒不应该是问题。如果您每秒在日志中写入 100 行,那么它滚动得太快,无论如何都看不到它:)
    【解决方案3】:

    创建一个长度为 ma​​xloglines * ma​​xlogentrywidth 的 char 数组。将其初始化为除每 ma​​xlogentrywidth 个字符换行之外的所有空白。在您的日志记录方法中,您偏移到 ma​​xlogentrywidth * rowIndex 并复制字符串中的 N 个字符,然后复制 ma​​xlogentrywidth-N 个空格。将 rowIndex 增加 (rowIndex+1) % maxlines

    要输出到单个字符串以用于窗口,请使用 constructor that let's you index into an array 连接两个字符串:new string(chararry, curpos, len) + new string(chararray, 0, curpos-1, chararray.Lengs - curpos) 其中 curposma​​xlogentrywidth * rowIndex

    当然,您必须添加适当的错误检查和线程安全。

    【讨论】:

    • 另一种方法是有几个可以容纳 maxloglines 的缓冲区;写给其中一个,任何时候它变得太满时,将它与另一个交换并丢弃旧的。虽然这种方法通常不如滚动数组方法好,但它可以在滚动数组方法不能的某些情况下使用,例如压缩流或享元流。
    【解决方案4】:

    可能的方法:

    • ObservableCollection&lt;string&gt;
    • ItemsControlItemsTemplate 是无边界只读 TextBox
    • 显然是数据绑定。

    当然,这有其局限性,因为您无法选择跨项目,但其中没有字符串连接,并且使用正确类型的ItemsControl,您可以在需要时使用虚拟化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2020-12-07
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      相关资源
      最近更新 更多