Search code examples
traceserilog

Can't redirect Trace.WriteLine to Serilog using SerilogTraceListener


In one of my project (.net core 3.1), I need a way to redirect System.Diagnostics.Trace.WriteLine to Serilog file. I found the SerilogTraceListener package which seems to be the right candidate.

Unfortunately until now, I haven't been able to find a way to make it works.

To reproduce it,
1) Create a .net core console project
2) Add the following nuget package : Serilog, SerilogTraceListener, Serilog.Sink.Console, Serilog.Sink.File
3) Overwrite the Program class code by the following

class Program
{
    static void Main(string[] args)
    {
        // Works fine
        Log.Logger = new LoggerConfiguration()
                       .WriteTo.Console()
                       .WriteTo.File("log.txt")
                       .CreateLogger();
        Log.Logger.Information("A string written using Logger.Information");

        // Trace is written in the console but not in the file
        Trace.Listeners.Add(new ConsoleTraceListener());
        Trace.Listeners.Add(new global::SerilogTraceListener.SerilogTraceListener());
        System.Diagnostics.Trace.WriteLine("A string written using Trace.WriteLine");
    }
}

What am I doing wrong?


Solution

  • TL;DR; You need to set the MinimumLevel to Debug or Verbose in order to see the Trace.WriteLine messages.


    SerilogTraceListener maps System.Diagnostic.TraceEventType to Serilog.LogEventLevel, and when you call Trace.WriteLine, it maps these events to the Debug log event level.

    That means Serilog's logger is receiving a message of type LogEventLevel.Debug.

    The minimum level configured in Serilog by default is Information, which means Debug messages are being suppressed.

    You have to configure the MinimumEventLevel to Debug (or Verbose) in order to see the Trace.WriteLine messages:

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug() // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        .WriteTo.Console()
        .WriteTo.File("log.txt")
        .CreateLogger();