templates - 如何配置 Serilog 输出模板以仅显示某些属性
问题描述
我正在尝试配置 Serilog
为能够推送属性,但在日志中只显示其中一些。
目前我的serilog配置如下:
Log.Logger = new LoggerConfiguration().Enrich.FromLogContext()
.WriteTo.File(logpath)
.WriteTo
.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Properties} {Message}")
.CreateLogger();
假设我有一个名为的属性MyProperty
,我只希望它显示在日志中:
string MyProperty="some value";
string MyOtherProperty="some other value";
LogContext.Push("MyProperty",MyProperty);
LogConetext.Push("MyOtherProperty",MyOtherProperty);
当我开始记录时,该Properties
部分将如下所示:
`{SourceContext= "[something]",Myproperty=[...],MyOtherProperty=[...]}`
如何将模板设置为仅显示MyProperty
(甚至不显示 LogContext)?
我试过这样无济于事:
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Properties:MyProperty} {Message}")
解决方案
无论您是否编写,似乎默认情况下都会添加 LogContext Enrich.FromLogContext()
。这是一个解决方法,您可以使用以下自定义丰富器来丰富记录器,从 EventLog 中删除这些属性。
public class SerilogContextEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
logEvent.RemovePropertyIfPresent("ActionId");
logEvent.RemovePropertyIfPresent("ActionName");
logEvent.RemovePropertyIfPresent("RequestId");
logEvent.RemovePropertyIfPresent("RequestPath");
logEvent.RemovePropertyIfPresent("CorrelationId");
logEvent.RemovePropertyIfPresent("MyOtherProperty");
}
}
像下面这样配置它:
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.With<SerilogContextEnricher>()
.WriteTo.File("logs/log.txt")
.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Properties} {Message}")
.CreateLogger();
推荐阅读
- swift - 必须有一个有效的 NSEntityDescription (SwiftUI)
- javascript - 删除 Next.js 中未使用的样式标签 CSS 问题
- python - 如何评估幂运算以使用 python 输出带有“e”的数字?
- php - Laravel:将参数从函数传递到 Excel 导出
- sql - 为什么相同的 postgres 查询不适用于两位数?
- flutter - 盯着学习Flutter。想知道如何将类导入有状态小部件
- python - 如何抓取网页并从中提取信息?
- git - git fetch 挂在 vscode 和 Github 桌面上
- marklogic - MarkLogic JavaScript 问题
- javascript - 计时器从用户输入的开始日期开始