简体   繁体   中英

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM