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

C# 记录与通用ILogger一起使用的类型<;T>;通过Serilog,c#,.net,serilog,C#,.net,Serilog,我目前正在Serilog中使用此输出模板: "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] {Message:lj}{NewLine}{Exception}" 我想添加在声明我注入的Microsoft.Extensions.Logging.ILogger记录器时指定的类,即如果我声明ILogger,那么我想通过模板输出MyType 我知道我可以添加整个上下文,但我了

我目前正在Serilog中使用此输出模板:

"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] {Message:lj}{NewLine}{Exception}"
我想添加在声明我注入的
Microsoft.Extensions.Logging.ILogger
记录器时指定的类,即如果我声明
ILogger
,那么我想通过模板输出
MyType

我知道我可以添加整个上下文,但我了解到这会带来性能损失,因此目前我通过向每条消息添加
nameof(MyType)
来添加类,这是一个混乱

是否有一个enricher或类似的东西可以使该类型在模板中可用(或者只是在每个日志消息前面加上该类型)

编辑:

实际上代码并不多,我就是这样使用dotnet core WebApi配置Serilog的:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    })
    .UseWindowsService()
    .UseSerilog();
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.UseWindowsService()
.useserlog();
这是我如何通过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"
专用只读ILogger\u记录器;
公共MyType(ILogger记录器)
{
_logger=logger??抛出新的ArgumentNullException(name of(logger));
}
公共无效HelloLog()
{
_logger.LogInformation(“你好”);
}
//预期的日志输出:“[MyType]你好”

我从Andy的评论中了解到,我可以编写一个LoggingProvider,并将其传递到UseSerilog重载中,该重载包含一组提供程序。如果没有更简单的事情发生,我将研究这一点。

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

"[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"

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

提供您的代码。因此,我们可以提供更好的建议非常确定您必须创建自己的
iLogger提供程序
,并将其添加到
iLogger工厂
@VimalCK。在这个问题上,不需要额外的代码。OP询问如何避免调用
Enrich.FromLogContext()
,并且仍然获得记录器的名称不要试图优化某些可能永远不会成为问题的内容,因为有人说可能会影响性能。日志记录对性能有影响,但我们之所以使用它是因为我们需要它。同意,但当我记得正确时,上下文也会返回完整的方法名,而不是日志记录程序提供的更简洁的类型名。我只需要类型名(我使用了许多具有类似功能的适配器,并且想知道事件发生在哪里)。因此,当名称实际上作为泛型类型参数可用时,反射出上下文并使用一些string.split which来获取类型似乎是一个运行时负担太重。我不希望输出类型的全名,而只输出ILogger模板参数提供的类型或类名。在文本日志中,SourceContext很好,但在其他一些日志记录工具(Greylog)和控制台中就不行了。我摸索了ILoggingProvider列表,但很快就丢失了,所以我想Robs的答案是最好的。