Search code examples
c#.netdependency-injectionserilog.net-5

How to dependency inject Serilog into the rest of my classes in .NET Console App


I'm getting started with Serilog but I don't know how to dependency inject the ILogger into my classes. It's easy if I was using ASP.NET Core 5, but I'm using a .NET Core Console App. How can I do similarly?

Before with log4net:

public class TestStrategy
{
    private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.Name);

    ...
}

My Serilog logger creation:

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

Do I have to DI logger into all classes?


Solution

  • Here's an example using .net 5 using Microsoft.Extensions.DependencyInjection;:

    Program.cs:

    namespace dotnet.console.app
    {
        using System.Threading.Tasks;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Hosting;
        using Serilog;
        class Program
        {
            static Task Main(string[] args) =>
                CreateHostBuilder(args).Build().RunAsync();
    
            static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureServices((_, services) =>
                        services.AddHostedService<Worker>()
                                .AddLogging(builder =>
                                {
                                    var logger = new LoggerConfiguration()
                                                .MinimumLevel.Debug()
                                                .WriteTo.Console()
                                                .CreateLogger();
    
                                    builder.AddSerilog(logger);
                                }));
        }
    }
    

    Worker.cs

    namespace dotnet.console.app
    {
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Extensions.Hosting;
        using Microsoft.Extensions.Logging;
    
        public class Worker : BackgroundService
        {
            private ILogger<Worker> _logger;
    
            public Worker(ILogger<Worker> logger)
            {
                this._logger = logger;
            }
    
            protected override async Task ExecuteAsync(CancellationToken stoppingToken)
            {
                while (!stoppingToken.IsCancellationRequested)
                {
                    this._logger.LogInformation("Hello, Serilog!");
                    await Task.Delay(1000, stoppingToken);
                }
            }
        }
    }
    

    csproj

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
        <PackageReference Include="Serilog" Version="2.10.0" />
        <PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
        <PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
        <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
      </ItemGroup>
    
    </Project>