我想知道是否有可能实现过滤,我们改进对 serilog 的过滤,使其对子记录器更加具体。目前我可以过滤命名空间,但是我只想访问特定命名空间中的一种方法来记录到电子邮件,该命名空间的其余方法应保留默认日志记录。
.Filter.ByIncludingOnly(Matching.FromSource("SomeNamespace"))
Run Code Online (Sandbox Code Playgroud)
但是,我只想访问 SomeNamespace 中的 method1,而不是访问也位于同一命名空间中的 method2。有任何想法吗?
我无法使用 Serilog 级别来实现此目的。最想要的是过滤器的使用。
为了按照您所描述的方式应用过滤器,您必须将方法名称用作可以过滤的日志上下文属性。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()否则属性将不会添加到日志上下文中。
对于少数方法来说,上述方法就可以了。如果您有许多方法并且需要动态获取方法的名称,那么您必须使用反映调用堆栈的自定义丰富器来捕获方法名称(这可能会影响性能,因为这是一项昂贵的操作)。