Serilog

Like many other libraries for .NET, Serilog provides diagnostic logging to files, the console, and elsewhere. It is easy to set up, has a clean API, and is portable between recent .NET platforms. Unlike other logging libraries, Serilog is built with powerful structured event data in mind.

Best practices

Console project

Add the following component packages to your project

Install-Package Serilog.Extensions.Logging
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
Copy the code
class Program
{
    static async Task Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
           .MinimumLevel.Information()
           .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
#if DEBUG
            .MinimumLevel.Override("Xxx", LogEventLevel.Debug)
#else
            .MinimumLevel.Override("Xxx", LogEventLevel.Information)
#endif
           .Enrich.FromLogContext()
           .WriteTo.File(Path.Combine(Directory.GetCurrentDirectory(), "Logs/logs.txt"))
           .WriteTo.Console()
           .CreateLogger();

        await CreateHostBuilder(args).RunConsoleAsync();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging((context, logging) => logging.ClearProviders())
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<XxxHostedService>();
            });
}
Copy the code
//XxxHostedService.cs
public class XxxHostedService : IHostedService
{
    private readonly IHostApplicationLifetime _hostApplicationLifetime;

    public XxxHostedService(IHostApplicationLifetime hostApplicationLifetime)
    {
        _hostApplicationLifetime = hostApplicationLifetime;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        using var application = AbpApplicationFactory.Create<XxxModule>(options =>
        {
            options.UseAutofac();
            options.Services.AddLogging(c => c.AddSerilog());
        });
        application.Initialize();

        var service = await application.ServiceProvider.GetRequiredService<XxxService>();
        service.XxxAsync();

        application.Shutdown();

        _hostApplicationLifetime.StopApplication();
    }

    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
Copy the code

AspNetCore project

Add the following component packages to your project

Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.Async
Install-Package Serilog.Sinks.File
Copy the code
public static async Task Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
#if DEBUG
        .MinimumLevel.Debug()
#else
        .MinimumLevel.Information()
#endif
        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
        .Enrich.FromLogContext()
        .WriteTo.Async(c => c.File($"Logs/{DateTime.Now:yyyy/MMdd}/logs.txt"))
        .CreateLogger();

        try
        {
            Log.Information("Starting Xxx.");

            await CreateHostBuilder(args).Build().RunAsync();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Xxx terminated unexpectedly!");
        }
        finally{ Log.CloseAndFlush(); }}internal static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseIISIntegration()
                          .UseStartup<Startup>();
            }).UseAutofac().UseSerilog();
}
Copy the code