Serilog 按方法名过滤
Serilog filter by method name
我想知道是否有可能实现过滤,我们改进了 serilog 的过滤,使其更具体地针对 sublogger。目前我可以过滤命名空间,但是我只想访问特定命名空间中的一个方法以记录到电子邮件,该命名空间的其余方法应保留默认日志记录。
.Filter.ByIncludingOnly(Matching.FromSource("SomeNamespace"))
但是我只想访问 SomeNamespace 中的 method1 而不想访问也位于同一命名空间中的 method2。有什么想法吗?
我无法使用 serilog 级别来实现此目的。最想要的是过滤器的使用。
为了按照您描述的方式应用过滤器,您必须将方法名称作为可以过滤的 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();
N.B.: 不要忘记添加 Enrich.FromLogContext()
否则属性将不会添加到日志上下文中。
对于少数方法,上面的就可以了。如果你有很多方法并且需要动态获取方法的名称,那么你必须使用 a custom enricher that reflects over the call stack to capture the method name (这可能会对性能产生影响,因为它是一项昂贵的操作)。
我想知道是否有可能实现过滤,我们改进了 serilog 的过滤,使其更具体地针对 sublogger。目前我可以过滤命名空间,但是我只想访问特定命名空间中的一个方法以记录到电子邮件,该命名空间的其余方法应保留默认日志记录。
.Filter.ByIncludingOnly(Matching.FromSource("SomeNamespace"))
但是我只想访问 SomeNamespace 中的 method1 而不想访问也位于同一命名空间中的 method2。有什么想法吗?
我无法使用 serilog 级别来实现此目的。最想要的是过滤器的使用。
为了按照您描述的方式应用过滤器,您必须将方法名称作为可以过滤的 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();
N.B.: 不要忘记添加 Enrich.FromLogContext()
否则属性将不会添加到日志上下文中。
对于少数方法,上面的就可以了。如果你有很多方法并且需要动态获取方法的名称,那么你必须使用 a custom enricher that reflects over the call stack to capture the method name (这可能会对性能产生影响,因为它是一项昂贵的操作)。