C# 如何在日志上下文中使用Serilog Enricher
Serilog Enricher(尤其是C# 如何在日志上下文中使用Serilog Enricher,c#,serilog,C#,Serilog,Serilog Enricher(尤其是LogEvent)是否需要知道推送到LogContext上的属性 我有一个属性被推送到Serilog上下文中: 使用(LogContext.PushProperty(LoggingConstants.MyProperty,_myValue)) { // ... } 我还注册了一个自定义enricher,如果属性不存在,它会添加一个属性,并将其填充到指定的长度: 公共类PaddedPropertyEnricher:ILogEventEnricher { 私
LogEvent
)是否需要知道推送到LogContext
上的属性
我有一个属性被推送到Serilog上下文中:
使用(LogContext.PushProperty(LoggingConstants.MyProperty,_myValue))
{
// ...
}
我还注册了一个自定义enricher,如果属性不存在,它会添加一个属性,并将其填充到指定的长度:
公共类PaddedPropertyEnricher:ILogEventEnricher
{
私有只读字符串_propertyName;
私有只读int_maxLength;
公共PaddedPropertyEnricher(字符串propertyName,int maxLength)
{
_propertyName=propertyName;
_maxLength=maxLength;
}
public void explore(LogEvent LogEvent,ILogEventPropertyFactory propertyFactory)
{
var property=propertyFactory.CreateProperty(_propertyName,新字符串(“”,_maxLength));
logEvent.AddPropertyIfAbsent(属性);
}
}
以及:
Log.Logger=new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.With(新的PaddedPropertyEnricher(LoggingConstants.MyProperty,3))
//等等。
此enricher的目的是使不包含自定义属性的日志条目不会导致日志条目中的列未对齐
例如,它的目的是改变这一点:
2021-06-10 12:23:33.676 +12:00 [INF] [] First message without MyProperty
2021-06-10 12:23:33.677 +12:00 [DBG] [123] Second message with MyProperty
为此:
2021-06-10 12:23:33.676 +12:00 [INF] [ ] First message without MyProperty
2021-06-10 12:23:33.677 +12:00 [DBG] [123] Second message with MyProperty
然而,这个enricher不起作用。当enricher针对我推送到上下文中的属性注册时,从LogEvent
检索的值总是null
——除非MyProperty
在日志消息本身中显式存在
这是一个已知的限制,还是我滥用了Enricher
这可能与在遇到的问题有关。该问题是由我的自定义Enrich在
Enrich.FromLogContext()之前注册引起的。
;e、 g:
//配置错误
Logger.Logger=新的LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.With(新的PaddedPropertyEnricher(LoggingConstants.MyProperty,3))
.WriteTo.Console(minimumLogLevels.Console,LogFormat)
//这里有其他接收器配置
.Enrich.FromLogContext()的
.CreateLogger();
通过确保Enrich.FromLogContext()
在依赖它的任何Enricher之前发生,问题得以解决;i、 e:
//配置良好
Logger.Logger=新的LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(minimumLogLevels.Console,LogFormat)
//这里有其他接收器配置
.Enrich.FromLogContext()的
.Enrich.With(新的PaddedPropertyEnricher(LoggingConstants.MyProperty,3))
.CreateLogger();
感谢您提示我查看完整的
Log.Logger
链。此问题是由我的自定义Enrich在Enrich.FromLogContext()之前注册造成的;e、 g:
//配置错误
Logger.Logger=新的LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.With(新的PaddedPropertyEnricher(LoggingConstants.MyProperty,3))
.WriteTo.Console(minimumLogLevels.Console,LogFormat)
//这里有其他接收器配置
.Enrich.FromLogContext()的
.CreateLogger();
通过确保Enrich.FromLogContext()
在依赖它的任何Enricher之前发生,问题得以解决;i、 e:
//配置良好
Logger.Logger=新的LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(minimumLogLevels.Console,LogFormat)
//这里有其他接收器配置
.Enrich.FromLogContext()的
.Enrich.With(新的PaddedPropertyEnricher(LoggingConstants.MyProperty,3))
.CreateLogger();
感谢您提醒我查看完整的Log.Logger
链
我是不是误用了Enricher
我相信在这种情况下你是对的
TL;博士Enricher是跨所有接收器共享的,因此,如果您只想针对一个特定接收器的输出格式,那么Enricher不是最佳选择。为了控制接收器的输出,应该使用接收器提供的机制,可以是输出模板,也可以是自定义模板
您似乎创建了一个带有空格的属性,只是为了影响特定接收器的格式化输出的方式。这不是设置接收器输出格式的“Serilog方式”
当您通过Enricher创建属性时,所有接收器都可以使用这些属性,,每个接收器都有责任根据属性写入的位置决定如何最好地序列化属性
通过创建带填充的属性,您假设所有接收器都希望该属性的格式与此完全相同,但将来可能不会这样
如果您只想在控制台接收器或使用标准Serilog输出模板的任何其他接收器中添加一些填充,则可以使用填充语法:
.WriteTo.Console(outputTemplate: "{Message}[{MyProperty,3}]")
这将确保在呈现属性时填充3
空格(如果属性不存在,则填充3个空格)
如果您需要对接收器的输出进行更多的控制,那么您可以提供一个自定义接口
您可以在上的文档中查看更多详细信息
我是不是误用了Enricher
我相信在这种情况下你是对的
TL;博士Enricher是跨所有接收器共享的,因此,如果您只想针对一个特定接收器的输出格式,那么Enricher不是最佳选择。为了控制接收器的输出,应该使用接收器提供的机制,可以是输出模板,也可以是自定义模板
您似乎创建了一个带有空格的属性,只是为了影响特定接收器的格式化输出的方式。这不是设置接收器输出格式的“Serilog方式”
当您通过Enricher创建属性时,所有接收器都可以使用这些属性,并且每个接收器都有责任