按方法名称过滤 Serilog

Prz*_*nic 1 c# serilog

我想知道是否有可能实现过滤,我们改进对 serilog 的过滤,使其对子记录器更加具体。目前我可以过滤命名空间,但是我只想访问特定命名空间中的一种方法来记录到电子邮件,该命名空间的其余方法应保留默认日志记录。

.Filter.ByIncludingOnly(Matching.FromSource("SomeNamespace"))
Run Code Online (Sandbox Code Playgroud)

但是,我只想访问 SomeNamespace 中的 method1,而不是访问也位于同一命名空间中的 method2。有任何想法吗?

我无法使用 Serilog 级别来实现此目的。最想要的是过滤器的使用。

Cai*_*ete 6

为了按照您所描述的方式应用过滤器,您必须将方法名称用作可以过滤的日志上下文属性。Serilog 中没有内置任何内容来捕获方法名称,因此您必须确保在写入日志时创建此属性。

使用LogContext您可以添加一个您了解的属性,该属性将标记要由特定过滤器包含(或排除)的日志消息。

例如

using (LogContext.PushProperty("ThisIsSuperCritical", true))
{
    Log.Information("This message will have the property `ThisIsSuperCritical`...");
    Log.Warning("... and this warning too");
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的日志记录管道中,您可以根据您要查找的属性在子记录器上应用过滤器。例如

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Logger(wt => wt
        .Enrich.FromLogContext()
        .Filter.ByIncludingOnly(Matching.WithProperty("ThisIsSuperCritical"))
        .WriteTo.SomeSink())
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记添加,Enrich.FromLogContext()否则属性将不会添加到日志上下文中。


对于少数方法来说,上述方法就可以了。如果您有许多方法并且需要动态获取方法的名称,那么您必须使用反映调用堆栈的自定义丰富器来捕获方法名称(这可能会影响性能,因为这是一项昂贵的操作)。

  • 你能告诉我 Matching.WithProperty("ThisIsSuperCritical") 的 json 等效项吗? (2认同)