[以编程方式构建以后要使用的LoggerConfiguration
时,我希望并成功地限制了对所有源上下文值除外(从旧Webforms网站上的Global.asax)使用扩展器。
但是在我看来,这似乎通过我相当不错且优雅的流利API摆脱了我认为Serilog库作为练习的意图(我不喜欢Invoke
调用:
private static LoggerConfiguration GetBasicLoggerConfig()
{
return new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.When(
logEvent => !Matching.FromSource("ASP.global_asax").Invoke(logEvent),
enrichmentConfig => enrichmentConfig.WithAnyKindOfEnricher());
}
我使用此逻辑将不在上下文中运行的浓缩器列表排除在外,并且只希望它们在页面生命周期内执行。但是无论这种情况如何,由于我将在其他地方应用此方法,因此我想保持其简洁明了,并且我对概念本身很感兴趣-“通过排除特定上下文来丰富它”。
我一直在寻找WhenNot
或NotMatching
之类的方式来表达“否定” /“排除”,但没有设法在库中找到它们。尝试使用静态类Matching
提供的其他方法,但无济于事。该项目很大,我想根据不同的上下文来个性化整个日志记录(因此最终使用一系列Enrich.When()
-以及大量的richer,获得带有多个“仅排除一个”的完整配置树上下文”部分看起来很难看/混乱)。
当然,如下面的示例中那样,集中声明上下文的默认值不会削减它,因为将通过.ForContext<T>()
声明不同的上下文,并且除了富集条件之外,所有其他上下文都必须被“捕获”。] >
// this does not cut it return new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.WithProperty(Serilog.Core.Constants.SourceContextPropertyName, "default") .Enrich.When(Matching.FromSource("default"), enrichmentConfig => enrichmentConfig.WithAnyKindOfEnricher());
希望我能解释我要达到的目标。 (出于清晰起见,lambda参数名称很长)
所以,我错过了什么还是有其他方法吗?如何最好地实现这种“排他性致富”?
后期编辑:
-忘了我只登录文件(使用文件接收器)。-至少在不久的将来不会整合Seq(我知道它的优势)。[当以编程方式建立一个LoggerConfiguration以便以后使用时,我希望并成功地限制了对所有源上下文值(除了一个旧的Global.asax以外的源上下文值)使用richer的限制]
// dotnet add package serilog.filters.expressions
.Enrich.When(
"SourceContext <> 'ASP.global_asax'"),
enrichmentConfig => enrichmentConfig.WithAnyKindOfEnricher());