c# - 记录与通用 ILogger 一起使用的类型通过 Serilog
问题描述
我目前正在将此输出模板与 Serilog 一起使用:
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] {Message:lj}{NewLine}{Exception}"
我想添加我在声明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();
这是我如何通过 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"
我从 Andy 的评论中了解到,我可以编写一个 LoggingProvider 并将其传递给使用一组提供程序的 UseSerilog 重载。如果没有更容易的事情出现,我会研究这一点。
解决方案
类型名称应该添加到由SourceContext
发出的任何日志事件的属性中ILogger<T>
,就像您在 . 上使用ForContext<T>()
orForContext(type)
方法一样Serilog.ILogger
。在消息模板中的某处使用{SourceContext}
应该允许您仅添加源名称,例如
"[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
请注意,这将输出类型的全名,因此将包含命名空间。
推荐阅读
- python - 我如何根据你的熊猫完成这个问题?
- mysql - 尽管数据库存在,但 MySql 中没有数据库选择错误
- html - 如何使用 CSS Flexbox 来弯曲多个高度/大小的盒子
- python - pandas DataFrame 的反向地理编码
- c++ - 从全局静态变量切换到静态变量会破坏代码
- python - 给定股票列表,从循环创建不同的数据框
- cors - Access-Control-Allow-Method 被神秘地重写
- r - 有没有更好的方法在 R 中写这个 if-else 语句?
- r - 按组将新的col添加到具有最大值的df
- python - 删除 CountVectorizer 中单次出现的单词