2

我有一个 C# Windows 窗体应用程序,它引用了一个使用 SeriLog 记录事件的 DLL(托管代码)。SeriLog 记录器是在 Windows 窗体(主)应用程序中定义的,因此我可以控制我正在使用的接收器类型。目前我只是登录到本地文本文件。

我的问题:有没有一种优雅的方式可以让我在应用程序运行时实时查看 Listbox 或类似 WinForms 控件中的日志?目前我能看到的唯一方法是每隔几秒钟读取一次日志文件并显示最新的项目。但我确信可能有一种更优雅的方式来捕获最后一个或两个记录的项目?

4

3 回答 3

2

这有您正在寻找的确切答案:是否可以在程序的 GUI 中显示 Serilog 日志?

然而在过去的5年里发生了一些事情!!!现在有一个名为: https ://github.com/serilog/serilog-sinks-reflectinsight 的库

我们为 ReflectInsight 实时日志查看器添加了 Serilog Sink。这使您可以利用当前对 Serilog 的投资,同时利用 ReflectInsight 查看器的强大功能和灵活性。您可以在一个丰富的查看器中实时查看您的 Serilog 消息,该查看器允许您过滤并搜索对您真正重要的内容。

于 2021-09-03T03:17:24.900 回答
1

鉴于您可以控制日志记录管道并且可以选择将使用的接收器,一种选择是使用接收Serilog.Sinks.RichTextBox器,它可以将日志写入RichTextBox具有颜色、格式等的控件。

Serilog.Sinks.RichTextBox

接收器最初是为 WPF 应用程序构建的,但您可以在带有ElementHost. 存储库中有一个示例,显示了如何将它与 Windows Forms 一起使用

免责声明:我是Serilog.Sinks.RichTextBox水槽的作者。

于 2021-09-03T03:13:09.320 回答
0

用于FileSystemWatcher监视文件更改,然后在OnChanged事件处理程序中更新该列表框

static void Main()
{
        using var watcher = new FileSystemWatcher(@"C:\path\to\folder");
        //choose what you wish
        watcher.NotifyFilter = NotifyFilters.Attributes
                             | NotifyFilters.CreationTime
                             | NotifyFilters.DirectoryName
                             | NotifyFilters.FileName
                             | NotifyFilters.LastAccess
                             | NotifyFilters.LastWrite
                             | NotifyFilters.Security
                             | NotifyFilters.Size;

        watcher.Changed += OnChanged;
        watcher.Created += OnCreated;
        watcher.Deleted += OnDeleted;
        watcher.Renamed += OnRenamed;
        watcher.Error += OnError;

        watcher.Filter = "YourLogFile.txt";
        watcher.IncludeSubdirectories = false;
        watcher.EnableRaisingEvents = true;

        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();
    }

    private static void OnChanged(object sender, FileSystemEventArgs e)
    {
        if (e.ChangeType != WatcherChangeTypes.Changed)
        {
            return;
        }
        //Console.WriteLine($"Changed: {e.FullPath}");
        //Update your Listbox content
    }
于 2021-09-03T03:01:15.723 回答