【问题标题】:Serilog filter by method nameSerilog 按方法名称过滤
【发布时间】:2020-12-14 08:13:07
【问题描述】:

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

.Filter.ByIncludingOnly(Matching.FromSource("SomeNamespace"))

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

我不能使用 serilog 级别来实现这一点。最想要的是过滤器的使用。

【问题讨论】:

    标签: c# serilog


    【解决方案1】:

    为了按照您描述的方式应用过滤器,您必须将方法名称作为log context property 提供,您可以对其进行过滤。 Serilog 中没有任何内置功能可以捕获方法名称,因此您必须确保在写入日志时创建此属性。

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

    例如

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

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

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

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


    对于少数方法,上述方法很好。如果您有很多方法并且需要动态获取方法的名称,那么您必须使用a custom enricher that reflects over the call stack to capture the method name(这可能会影响性能,因为它是一项昂贵的操作)。

    【讨论】:

    • 你能告诉我 Matching.WithProperty("ThisIsSuperCritical") 的 json 等价物吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2011-03-14
    • 1970-01-01
    • 2022-10-01
    • 2010-09-25
    • 2018-09-03
    • 2020-06-20
    相关资源
    最近更新 更多