Fritz45
Fritz45

Reputation: 782

View Serilog logs in Windows Forms application

I have a C# Windows Forms application that is referencing a DLL (managed code) that is using SeriLog to log events. The SeriLog logger is defined in the Windows Forms (main) application, so I have control over the type of sink I am using. Currently I am just logging to a local text file.

My question: is there an elegant way for me to view the log in a Listbox or similar WinForms control in real time while the application is running? The only way I can see at the moment is to read the Log file every few seconds and display the latest item. But I am sure there may be a more elegant way to do capture just the last one or two logged items?

Upvotes: 3

Views: 5230

Answers (3)

Jeremy Thompson
Jeremy Thompson

Reputation: 65672

This has the exact answer you're looking for: Is it possible to display Serilog log in the program's GUI?

However something has happened in the last 5 years!!! There's now a library called: https://github.com/serilog/serilog-sinks-reflectinsight

We've added a Serilog Sink for ReflectInsight live log viewer. This allows you to leverage your current investment in Serilog, but leverage the power and flexibility that comes with the ReflectInsight viewer. You can view your Serilog messages in real-time, in a rich viewer that allows you to filter out and search for what really matters to you.

Upvotes: 3

C. Augusto Proiete
C. Augusto Proiete

Reputation: 27878

Given that you have control over the logging pipeline and can choose the sink(s) that will be used, one option would be to use the Serilog.Sinks.RichTextBox sink which can write logs to a RichTextBox control with colors, formatting, etc.

Serilog.Sinks.RichTextBox

The sink was originally built for WPF apps, but you can easily use it in a Windows Forms application with an ElementHost. There's an example in the repository that shows how to use it with Windows Forms.

Disclaimer: I'm the author of the Serilog.Sinks.RichTextBox sink.

Upvotes: 2

David
David

Reputation: 16277

Use FileSystemWatcher to monitor the file change and then update that Listbox in the OnChanged event handler

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
    }

Upvotes: 1

Related Questions