首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >串行日志和.NET核心2.1 HostBuilder配置

串行日志和.NET核心2.1 HostBuilder配置
EN

Stack Overflow用户
提问于 2018-06-07 04:01:53
回答 4查看 15.3K关注 0票数 12

我正在使用GRPCCore2.1 HostBuilder类来设置和运行.NET服务器,但是在正确配置SeriLog时遇到了问题,使得.NET核心日志记录管道以及我的应用程序中的其他地方都可以使用它(通过依赖注入)。

class Program
{
    private static async Task Main(string[] args)
    {
        var hostBuilder = new HostBuilder()
            .ConfigureServices((hostContext, services) =>
            {
                services.AddSingleton<ILogger>(BuildLogger);

                // other services here 
            })
            .ConfigureLogging((hostContext, loggingBuilder) =>
                loggingBuilder.AddSerilog(dispose: true));

        await hostBuilder.RunConsoleAsync();
    }

    private static ILogger BuildLogger(IServiceProvider provider)
    {

        // create a (global) logger
        Log.Logger = new LoggerConfiguration() 
            ...
            .CreateLogger();

        return Log.Logger;
    }
}

问题是,我需要调用loggingBuilder.AddSerilog()来使用上面几行DI服务配置中注册的单例ILogger

我意识到我可以直接调用BuildLogger()来获取ILogger实例,并将该实例注册到DI服务配置中,但似乎不应该这样做。我正在寻找一种从.ConfigureLogging()方法中访问ServiceProvider实例的方法,这样我就可以获得注册的ILogger,如下所示

serviceProvider.GetRequiredService<ILogger>();

并将其传递给AddSerilog()调用。有什么想法吗?

EN

回答 4

Stack Overflow用户

发布于 2018-06-07 06:18:02

尝试在Serilog - https://github.com/serilog/serilog-extensions-hosting中提供的新包。

  public static IHost BuildHost(string[] args) =>
    new HostBuilder()
        .ConfigureServices(services => services.AddSingleton<IHostedService, PrintTimeService>())
        .UseSerilog() // <- Add this line
        .Build();
票数 12
EN

Stack Overflow用户

发布于 2019-05-03 04:51:27

下面是一个示例,展示了如何做到这一点,包括使用appsettings.json配置serilog,如何使用ILogger获得日志记录,而不必手动注入它,如标记的答案所示,以及如何还可以IOptions:

    public class Settings
{
    public string Sample { get; set; }
}

public class Service : IHostedService
{
    private readonly ILogger<Service> _logger;
    private Settings _settings;
    public Service(ILogger<Service> logger,
        Settings settings)
    {
        _logger = logger;
        _settings = settings;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        var host = new HostBuilder()
                   .ConfigureHostConfiguration(builder =>
                   {
                       builder.AddJsonFile("hostsettings.json", optional: true);
                   })
                   .ConfigureAppConfiguration((hostContext, builder) =>
                   {
                       builder.AddJsonFile("appsettings.json");
                       builder.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                   })
                   .ConfigureLogging((hostContext, builder) =>
                   {
                       Log.Logger = new LoggerConfiguration()
                                    .ReadFrom.Configuration(hostContext.Configuration).CreateLogger();
                       builder.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
                       builder.AddSerilog(dispose: true);
                   })
                   .ConfigureServices((hostContext, services) =>
                   {
                       var settings = hostContext.Configuration.GetSection("Configuration").Get<Settings>();
                       services.AddSingleton(settings);

                       services.AddHostedService<Service>();
                       services.AddLogging();
                       services.AddOptions();
                   })
                   .Build();

        using (host)
        {
            await host.StartAsync();
            await host.WaitForShutdownAsync();
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2018-06-07 04:19:04

根据.NET核心2.0+存储库上的文档,在提供的loggingBuilder上调用AddSerilog(),并确保首先配置Serilog:

//...

private static async Task Main(string[] args) {

    Log.Logger = new LoggerConfiguration()
        //...
        .CreateLogger();

    var hostBuilder = new HostBuilder()
        .ConfigureServices((hostContext, services) => {        
            services.AddLogging(loggingBuilder =>
                loggingBuilder.AddSerilog(dispose: true));

            // other services here 
        });

    await hostBuilder.RunConsoleAsync();
}

//...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50728639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档