How to use Serilog in .NET Core Console app
I'm not sure about builder.SetMinimumLevel
(it doesn't use the Serilog enum).
We set the logger level when creating the LoggerConfiguration
object.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Debug) // restricted... is Optional
(...)
.CreateLogger();
BTW. It's worth pointing out the following section from Configuration Basics
Logger vs. sink minimums - it is important to realize that the logging level can only be raised for sinks, not lowered. So, if the logger's MinimumLevel is set to Information then a sink with Debug as its specified level will still only see Information level events. This is because the logger-level configuration controls which logging statements will result in the creation of events, while the sink-level configuration only filters these. To create a single logger with a more verbose level, use a separate LoggerConfiguration.
I'm not sure about builder.AddSerilog
.
Here's what works for me.
using Serilog;
(...)
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
(...)
.CreateLogger();
(...)
return new HostBuilder()
.ConfigureHostConfiguration(...)
.ConfigureServices(...)
.UseSerilog();
mnj
Updated on May 07, 2021Comments
-
mnj about 3 years
I wanted my application to have capability of logging to a file, so I started to look for something more than default .NET Core 2.2 logging framework. I see that Serilog might do the job. However, I cannot find any document on how to setup Serilog in .NET Core Console application with Dependency Injection. All I see is ASP.NET materials, which is probably not what I need.
I started doing it myself. I installed (Nuget):
- Serilog
- Serilog.Extensions.Logging
- Serilog.Sinks.File
- Serilog.Sinks.Console (to use Serilog for all my logging)
I created an extension for
ServiceCollection
public static void AddLogging(this IServiceCollection services, Microsoft.Extensions.Logging.LogLevel logLevel) { var serilogLogger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("log.txt") .CreateLogger(); services.AddLogging(builder => { builder.SetMinimumLevel(logLevel); builder.AddSerilog(logger: serilogLogger, dispose: true); }); }
Logging works, however:
- log level is not what I set it to. It seems that serilog is using INFO level, although I wanted to have DEBUG. Why isn't my setting respected? After all, I'm still using NET Core's logging framework, so I'm using it to setup the log level
- am I actually doing this setup correctly? I am not really sure if
dispose
should betrue
. Generally, I want NET Core's Dependency Injection framework to take care of disposal of services.
-
mnj over 4 yearsYour first point about configuration is valid also in my case. The
builder.SetMinimumLevel
settin has higher priorit than Serilog's setting. So, I can set Verbose logging on Serilog and the actual desired level on Microsoft logging to get what I need. I see you are in some hosted application, like ASP.NET. Probably you're using Serilog.AspNetCore package. In my case, I don't have any host.