Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serilog MinimumLevel Override with AspNetCore

Serilog with ASP NET 5 Razor Pages.

Reducing log verbosity is very useful for Informational logs.

However for debug logs, how to get a MinimumLevel.Override("Microsoft.AspNetCore") to be specific to a debug file sink?

Creating 2 configurations could be a solution, but feels like something more elegant may be possible?

Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()

// for debug file sink I want the override to be Debug
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Debug)

.WriteTo.File("debug.txt", restrictedToMinimumLevel: LogEventLevel.Debug)

// for info and warning file sinks I want the override to be Warning
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)

.WriteTo.File("info.txt", restrictedToMinimumLevel: LogEventLevel.Information)
.WriteTo.File("warning.txt", restrictedToMinimumLevel: LogEventLevel.Warning)
.CreateLogger();

Everything works as expected using just one override. But not together.

In the example above the Warning override takes precedence and no AspNetCore Debug event logs are written to debug.txt

Edit

In summary, I'd like my debug log to include Information event level from Microsoft.AspNetCore and my info log file to include Warning event level from Microsoft.AspNetCore

enter image description here

I got the 2 logs files how I wanted by commenting out and in 1. and 2. below

// 1. for debug file sink I want AspNetCore.Information or Debug level override
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Information)
.WriteTo.File($@"{logFilePath}debugx.txt", restrictedToMinimumLevel: LogEventLevel.Debug, rollingInterval: RollingInterval.Day)

// 2. for info and warning file sinks below I want only AspNetCore warnings
//.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)

It's an interesting one

like image 824
Dave Mateer Avatar asked Jan 19 '26 21:01

Dave Mateer


1 Answers

You want to filter log data and want to populate into different file sinks.

For Example /Logs/Error/Errlog.txt and /Logs/Info/InfoLog.txt

You can achieve this by using Serilog.Expressions nuget package. If time permits, I will paste a working example here.

Serilog.Expressions sample from Serilog

https://github.com/serilog/serilog-expressions/blob/dev/example/Sample/Program.cs

In below example it will exclude Name=User line and only print second line on console

using var log = new LoggerConfiguration()
                                .Filter.ByExcluding("@m like 'Welcome!%' and Name = 'User'")
                                .WriteTo.Console()
                                .CreateLogger();
    // Logged normally
   log.Information("Welcome!, {Name}", "User");

   // Excluded by the filter
   log.Information("Welcome!, {Name}", "Domain\\UserName");

Here is the filtering example for \Logs\Info\Info-20210720.txt which filters Error, Fatal or Warning levels. More information here

 var exprInfo = "@l='Error' or @l='Fatal' or @l='Warning'";

            var loggerInfo = new LoggerConfiguration()                            
                             .WriteTo.File(
                                 @"C:\Temp\Logs\Info\Info-.txt",
                                 fileSizeLimitBytes: 1_000_000,
                                 outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] [{SourceContext}] [{EventId}] {Message}{NewLine}{Exception}",
                                 rollingInterval: RollingInterval.Day,
                                 rollOnFileSizeLimit: true,
                                 shared: true,
                                 flushToDiskInterval: TimeSpan.FromSeconds(1))
                            .MinimumLevel.Override("Microsoft", LogEventLevel.Debug)
                            .Filter.ByExcluding(exprInfo)
                            .CreateLogger();

  try
            {
                loggerInfo.Debug("TEST");

                SelfLog.Enable(Console.Out);

                var sw = System.Diagnostics.Stopwatch.StartNew();
              

                for (var i = 0; i < 100; ++i)
                {
                    loggerInfo.Information("Hello, file logger!>>>>>>{Count}", i);
                    loggerInfo.Information("Writing to log file with INFORMATION severity level.");

                    loggerInfo.Debug("Writing to log file with DEBUG severity level.");

                    loggerInfo.Warning("Writing to log file with WARNING severity level.");

                    loggerInfo.Error("Writing to log file with ERROR severity level.");

                    loggerInfo.Fatal("Writing to log file with CRITICAL severity level.");

                }



                sw.Stop();

                Console.WriteLine($"Elapsed: {sw.ElapsedMilliseconds} ms");
                Console.WriteLine($"Size: {new FileInfo("log.txt").Length}");

                Console.WriteLine("Press any key to delete the temporary log file...");
                Console.ReadKey(true);
                
            }
            catch (Exception ex)
            {
                loggerInfo.Fatal(ex, "Application Start-up for Serilog failed");
                throw;
            }
            finally
            {
                Log.CloseAndFlush();
            }

enter image description here enter image description here

like image 80
Chinmay T Avatar answered Jan 21 '26 22:01

Chinmay T



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!