我正在使用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()
调用。有什么想法吗?
发布于 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();
发布于 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();
}
}
}
发布于 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();
}
//...
https://stackoverflow.com/questions/50728639
复制相似问题