如何将 Serilog 依赖注入到 .NET 控制台应用程序中的其余类中

nop*_*nop 3 .net c# dependency-injection serilog .net-5

我正在开始使用Serilog,但我不知道如何将 ILogger 依赖项注入到我的类中。如果我使用 ASP.NET Core 5,这很容易,但我使用的是 .NET Core 控制台应用程序。我怎样才能做类似的事情?

在使用 log4net 之前:

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

我的 Serilog 记录器创建:

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

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

我必须 DIlogger进入所有课程吗?

Mel*_*hia 9

这是使用 .net 5 的示例Microsoft.Extensions.DependencyInjection;

程序.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);
                            }));
    }
}
Run Code Online (Sandbox Code Playgroud)

工人.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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

工程项目

<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>
Run Code Online (Sandbox Code Playgroud)