'ASP.NET Core Web API - How to convert SetupSerilog in .NET Core 5 to .NET Core 6 Program.cs
I have a code in ASP.NET Core-5 Web API which I want to convert to ASP.NET Core-6 Web API.
I have this extension.
LogSettingsExtension:
public static class LogSettingsExtension
{
public static void SetupSerilog(IConfiguration config)
{
DocumentStore ravenStore = new()
{
Urls = new string[] { config["RavenDBConfigurations:ConnectionURL"] },
Database = config["RavenDBConfigurations:DatabaseName"]
};
ravenStore.Certificate = new X509Certificate2(config["RavenDBConfigurations:CertificateFilePath"],
config["RavenDBConfigurations:Password"], X509KeyStorageFlags.MachineKeySet);
ravenStore.Initialize();
Log.Logger = new LoggerConfiguration()
.WriteTo.File(
path: ".\\Logs\\log-.txt",
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
rollingInterval: RollingInterval.Day,
restrictedToMinimumLevel: LogEventLevel.Information
)
.WriteTo.RavenDB(ravenStore)
.CreateLogger();
}
}
In .NET Core-5 I used it in Program.cs as:
public class Program
{
public static void Main(string[] args)
{
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var isDevelopment = env == Environments.Development;
IConfiguration config = ConfigurationSetupExtension.GetConfig(isDevelopment);
LogSettingsExtension.SetupSerilog(config);
try
{
Log.Information("Application is starting...");
CreateHostBuilder(args)
.Build()
.Run();
}
catch (Exception ex)
{
Log.Fatal(ex.StackTrace, "Application failed to start");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
How do I transform this to Program.cs in .NET Core-6 since everything has changed?
Thanks
Solution 1:[1]
You can setup your Program.cs as shown below. Initially a BootstrapLogger is setup that is used during Main method only and logs only on console. During CreateHostBuilder Serilog is setup from your configuration for use in your program.
public class Program
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateBootstrapLogger();
try
{
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((context, services, configuration) =>
{
configuration
.ReadFrom.Configuration(context.Configuration);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Sample configuration in your appsettings.json that will log on console and file.
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "logs\\log-file-.txt" }
}
],
"Enrich": [ "FromLogContext" ]
}
One issue is that this provides no direct way to log in your Startup -> ConfigureServices(). There are some workarounds however.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Nish26 |
