通过 Serilog 记录与通用 ILogger<T> 一起使用的类型

Tvd*_*vdH 5 .net c# serilog

我目前正在将此输出模板与 Serilog 一起使用:

"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] {Message:lj}{NewLine}{Exception}"
Run Code Online (Sandbox Code Playgroud)

我想添加在声明我Microsoft.Extensions.Logging.ILogger注入的记录器时指定的类,即如果我声明,ILogger<MyType>那么我想MyType通过模板输出。

我知道我可以添加整个上下文,但我读到这会带来性能损失,所以目前我通过添加nameof(MyType)到每条消息来添加类 - 这是一团糟。

是否有丰富的内容或类似的东西可以使类型在模板中可用(或者只是在每个日志消息中添加该类型的前缀)?

编辑:

实际上没有太多代码,这就是我使用 dotnet-core WebApi 配置 Serilog 的方式:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    })
    .UseWindowsService()
    .UseSerilog();
Run Code Online (Sandbox Code Playgroud)

这是我如何通过 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"
Run Code Online (Sandbox Code Playgroud)

我从 Andy 的评论中了解到,我可以编写一个 LoggingProvider 并将其传递到采用提供程序集合的 UseSerilog 重载中。如果没有更容易的事情出现,我会研究这个问题。

rob*_*ker 4

类型名称应添加到SourceContext发出的任何日志事件的属性中ILogger<T>,就像您在 上使用ForContext<T>()或方法一样。在消息模板中使用某处应该允许您仅添加源名称,例如ForContext(type)Serilog.ILogger{SourceContext}

"[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
Run Code Online (Sandbox Code Playgroud)

请注意,这将输出类型的全名,因此将包括命名空间。