如何为最后100个日志行实现内存日志记录器

本文关键字:日志 实现 内存 记录器 100个 最后 | 更新日期: 2023-09-27 18:05:40

如何使高效的内存日志仅存储最后100个条目和可以快速输出结果字符串到TextBox(在每次更新)?

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

如何为最后100个日志行实现内存日志记录器

一个简单的Queue有什么问题:

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

你查过Log4Net吗?

更具体地说,log4net.Appender.MemoryAppender

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

要输出单个字符串用于窗口,使用构造函数连接两个字符串,让您索引到数组:new string(chararry, curpos, len) + new string(chararray, 0, curpos-1, chararray.Lengs - curpos),其中curposmaxlogentrywidth * rowIndex

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

可能的方法:

  • ObservableCollection<string>
  • ItemsControl, ItemsTemplate为无边界只读TextBox
  • 数据绑定,显然。

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