Description
There's following snippet of code in README.md
:
public class Program
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
try
{
// ...
}
finally
{
Log.CloseAndFlush();
}
}
}
No configuration (config file) is used - you configure logger in place programmatically - this way, you can't put your configuration to appsettings.json
(unless there's something magical which takes care later).
There's link to sample project which contains following code:
public class Program
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext()
.WriteTo.Debug()
.WriteTo.Console(
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}")
.CreateLogger();
try
{
// ...
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog();
}
Notice that user is encouraged to use use ConfigurationBuilder
and read appsettings.json
at this very place. However, if you check what ConfigureWebHostDefaults
does later on - yeah, it reads appsettings.json
as well.
Sure, this has tiny impact on startup time, however I'm bit worried about duplication here. It may also happen you read configuration different way than is read second time - debugging is going to be fun. Last but not least, there's additional complexity which may not be clear to some.
Is this really the right way how to use Serilog?
Instead of all that above, example should start just with:
public class Program
{
public static void Main(string[] args) =>
CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
// Use Serilog - use configuration read by web host
.UseSerilog(
(hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));
}