C# Net Core 3.0和Serilog生成输出,如Microsoft.Extensions.Logging
我有一个使用.NETCore3.0的简单web应用程序 在主机生成器中,我执行以下操作:C# Net Core 3.0和Serilog生成输出,如Microsoft.Extensions.Logging,c#,logging,dependency-injection,.net-core,serilog,C#,Logging,Dependency Injection,.net Core,Serilog,我有一个使用.NETCore3.0的简单web应用程序 在主机生成器中,我执行以下操作: public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => {
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console());
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.useserlog((hostingContext,loggerConfiguration)=>loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()的
.WriteTo.Console());
然后,我尝试在web app项目引用的另一个项目(使用netcoreapp3.0的简单dll)中实现它:
using using Microsoft.Extensions.Logging;
...
private readonly ILogger<MyClass> _logger;
public MyClass(ILogger<MyClass> logger){
_logger = logger;
...
Log.Logger.Information("this is a test {test}", command.GetType().Name);
_logger.LogInformation("Command received: {CommandType}", command.GetType().Name);
}
...
使用Microsoft.Extensions.Logging;
...
专用只读ILogger\u记录器;
公共MyClass(ILogger记录器){
_记录器=记录器;
...
Log.Logger.Information(“这是一个测试{test}”,command.GetType().Name);
_logger.LogInformation(“收到的命令:{CommandType}”,Command.GetType().Name);
}
...
静态记录器工作正常,但_记录器的输出就好像我使用默认日志一样。但据我从阅读中了解,主机生成器现在替换了iLogger工厂,应该输出Serilog样式的输出
如何使_logger输出与Serilog输出一样整洁?我遇到的问题是,每当我捕获队列事件时,日志都使用Microsoft.Extensions.Logging样式的日志 这似乎是因为事件侦听器在日志工厂被替换之前以某种方式被注册,但在之后被执行,这导致了奇怪的日志记录。我的解决方案是:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console());
webBuilder.UseStartup<Startup>();
});
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.useserlog((hostingContext,loggerConfiguration)=>loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()的
.WriteTo.Console());
webBuilder.UseStartup();
});
我遇到的问题是,每当我捕获队列事件时,日志都使用Microsoft.Extensions.Logging样式的日志记录
这似乎是因为事件侦听器在日志工厂被替换之前以某种方式被注册,但在之后被执行,这导致了奇怪的日志记录。我的解决方案是:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console());
webBuilder.UseStartup<Startup>();
});
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.useserlog((hostingContext,loggerConfiguration)=>loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()的
.WriteTo.Console());
webBuilder.UseStartup();
});
非常奇怪!你能在玩具项目中重现这个问题吗?(即文件>新项目EXE和附带的类库?)有趣。当我试图复制我的玩具项目时,它运行良好。在主项目中,当web应用程序从消息队列获取消息并启动连接到队列的侦听器时,就会发生这种情况。我会看看能否在我的玩具项目中重现这种行为。好吧,有点尴尬,但我最终解决了它。我会发布我自己问题的答案。非常奇怪!你能在玩具项目中重现这个问题吗?(即文件>新项目EXE和附带的类库?)有趣。当我试图复制我的玩具项目时,它运行良好。在主项目中,当web应用程序从消息队列获取消息并启动连接到队列的侦听器时,就会发生这种情况。我会看看能否在我的玩具项目中重现这种行为。好吧,有点尴尬,但我最终解决了它。我将发布我自己问题的答案。