通过 Serilog 记录与通用 ILogger<T> 一起使用的类型
Log the type used with the generic ILogger<T> via Serilog
我目前正在将此输出模板与 Serilog 一起使用:
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] {Message:lj}{NewLine}{Exception}"
我想添加我在声明我注入的 Microsoft.Extensions.Logging.ILogger
记录器时指定的 class,即如果我声明 ILogger<MyType>
那么我想输出 MyType
通过模板。
我知道我可以添加整个上下文,但我读到这会带来性能损失,所以目前我通过向每条消息添加 nameof(MyType)
来添加 class - 这是一团糟。
是否有增强器或类似的东西可以使类型在模板中可用(或者只是在每个日志消息前加上类型)?
编辑:
确实没有太多代码,这就是我使用 dotnet-core WebApi 配置 Serilog 的方式:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseWindowsService()
.UseSerilog();
这是我如何通过 IOC 使用记录器的示例:
private readonly ILogger<MyType> _logger;
public MyType(ILogger<MyType> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public void HelloLog()
{
_logger.LogInformation("hello");
}
// expected log output: "[MyType] hello"
我从安迪的评论中了解到,我可以编写一个 LoggingProvider 并将其传递到采用一组提供程序的 UseSerilog 重载中。如果没有更容易的事情发生,我会研究这个问题。
类型名称应添加到 ILogger<T>
发出的任何日志事件的 SourceContext
属性 中,就像您使用 ForContext<T>()
或ForContext(type)
个 Serilog.ILogger
方法。在消息模板中的某处使用 {SourceContext}
应该允许您仅添加源名称,例如
"[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
请注意,这将输出类型的全名,因此将包括命名空间。
我目前正在将此输出模板与 Serilog 一起使用:
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] {Message:lj}{NewLine}{Exception}"
我想添加我在声明我注入的 Microsoft.Extensions.Logging.ILogger
记录器时指定的 class,即如果我声明 ILogger<MyType>
那么我想输出 MyType
通过模板。
我知道我可以添加整个上下文,但我读到这会带来性能损失,所以目前我通过向每条消息添加 nameof(MyType)
来添加 class - 这是一团糟。
是否有增强器或类似的东西可以使类型在模板中可用(或者只是在每个日志消息前加上类型)?
编辑:
确实没有太多代码,这就是我使用 dotnet-core WebApi 配置 Serilog 的方式:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseWindowsService()
.UseSerilog();
这是我如何通过 IOC 使用记录器的示例:
private readonly ILogger<MyType> _logger;
public MyType(ILogger<MyType> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public void HelloLog()
{
_logger.LogInformation("hello");
}
// expected log output: "[MyType] hello"
我从安迪的评论中了解到,我可以编写一个 LoggingProvider 并将其传递到采用一组提供程序的 UseSerilog 重载中。如果没有更容易的事情发生,我会研究这个问题。
类型名称应添加到 ILogger<T>
发出的任何日志事件的 SourceContext
属性 中,就像您使用 ForContext<T>()
或ForContext(type)
个 Serilog.ILogger
方法。在消息模板中的某处使用 {SourceContext}
应该允许您仅添加源名称,例如
"[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
请注意,这将输出类型的全名,因此将包括命名空间。