使用忽略的过滤器登录多个文件

Logging in multiple files with filters which are ignored

我已经为一个 serilog 定义了两个过滤器 LoggerConfiguration 两者都是 RollingFile 记录器,根据类型写入另一个文件夹中的日志文件。

var activityPath = @"C:\temp\Activities\log-{Date}.log";

var eventsPath = @"C:\temp\Events\log-{Date}.log";

loggerConfig.WriteTo.Logger(
                    lc =>
                        lc.Filter.ByExcluding(Matching.FromSource<EventLogItem>())
                            .WriteTo.RollingFile(pathFormat: eventsPath,
                                fileSizeLimitBytes: 1073741824,
                                retainedFileCountLimit: 31));
loggerConfig.WriteTo.Logger(
                    lc =>
                        lc.Filter.ByExcluding(Matching.FromSource<ActivityLogItem>())
                            .WriteTo.RollingFile(pathFormat: activityPath,
                                fileSizeLimitBytes: 1073741824,
                                retainedFileCountLimit: 31));

_logger.Information("{@ActivityLogItem}", new ActivityLogItem());
_logger.Information("{@EventLogItem}", new EventLogItem());

当我使用此配置登录时,两个文件夹中的两个文件都会生成,但这些文件包含 EventLogItemActivityLogItem.

的条目

文件:Activities\log-2016..日志

2016-12-29 17:36:47.610 +01:00 [Information] EventLogItem { Id: 00000000-0000-0000-0000-000000000000, TimeStamp: 01/01/0001 00:00:00, Title: "Startup", Detail: "Starting up" } 2016-12-29 17:57:32.297

+01:00 [Information] ActivityLogItem { Ip: "::1", Port: "-1", UserAgent: "Mozilla/5.0", StartRequest: 12/29/2016 17:57:29, EndRequest: 12/29/2016 17:57:29 }

文件:Events\log-2016..日志

2016-12-29 17:36:47.610 +01:00 [Information] EventLogItem { Id: 00000000-0000-0000-0000-000000000000, TimeStamp: 01/01/0001 00:00:00, Title: "Startup", Detail: "Starting up" } 2016-12-29 17:57:32.297

+01:00 [Information] ActivityLogItem { Ip: "::1", Port: "-1", UserAgent: "Mozilla/5.0", StartRequest: 12/29/2016 17:57:29, EndRequest: 12/29/2016 17:57:29 }

我也试过ByIncludingOnly在Filter配置下,结果是没有生成文件

我的配置应该如何使 serilog 为一种类型登录不同的文件?

编辑:

我现在也试过加一个Matching.WithProperty

在我的 class ActivityLogItem 我添加了一个新的 属性:

public int EType {get;set;} = 1;

并将配置更改为

ByExcluding(Matching.WithProperty<int>("EType", p => p == 1)

这也被忽略了。记录器将两个条目写入指定的两个文件。

FromSource() 过滤器识别特定记录器引发的事件:

_logger.ForContext<ActivityLogItem>()
     .Information("This would be picked up by the filters");

WithProperty() 过滤器查看日志事件的直接属性,即消息模板中嵌入的名称,如 {@ActivityLogItem}。在您的后续编辑中,EType 属性 是嵌套的 属性,因此与过滤器不匹配。

如果您想使用该方法,您可以执行以下操作:

_logger.Information("{EType} {@ActivityLogItem}", 1, new ActivityLogItem());

设置过滤的方法有多种;如果您愿意,我会推荐 ForContext() 方法。或者,如果您不想修改日志语句,请尝试:

Filter.ByExcluding(evt => evt.Properties.TryGetValue("ActivityLogItem"));