当源上下文不是特定值时,最好的丰富方法

问题描述 投票:2回答:2

[以编程方式构建以后要使用的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());
}

我使用此逻辑将不在上下文中运行的浓缩器列表排除在外,并且只希望它们在页面生命周期内执行。但是无论这种情况如何,由于我将在其他地方应用此方法,因此我想保持其简洁明了,并且我对概念本身很感兴趣-“通过排除特定上下文来丰富它”。

我一直在寻找WhenNotNotMatching之类的方式来表达“否定” /“排除”,但没有设法在库中找到它们。尝试使用静态类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的限制]

c# logging serilog
2个回答
2
投票
Serilog.Filters.Expressions对此更好:

// dotnet add package serilog.filters.expressions .Enrich.When( "SourceContext <> 'ASP.global_asax'"), enrichmentConfig => enrichmentConfig.WithAnyKindOfEnricher());


1
投票
如果您将日志记录配置定义为代码(而不是通过JSON文件或AppSettings),那么,我建议您只编写纯C#代码,然后执行以下操作:
© www.soinside.com 2019 - 2024. All rights reserved.