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

时间:2016-12-29 17:03:29

标签: c# serilog

我为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 .... log

  

2016-12-29 17:36:47.610 +01:00 [信息] EventLogItem {Id:   00000000-0000-0000-0000-000000000000,TimeStamp:01/01/0001 00:00:00,   标题:“Startup”,Detail:“Starting up”} 2016-12-29 17:57:32.297

     

+01:00 [信息] ActivityLogItem {Ip:“:: 1”,端口:“ - 1”,UserAgent:“Mozilla / 5.0”,StartRequest:12/29/2016 17:57:29,   EndRequest:12/29/2016 17:57:29}

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

  

2016-12-29 17:36:47.610 +01:00 [信息] EventLogItem {Id:   00000000-0000-0000-0000-000000000000,TimeStamp:01/01/0001 00:00:00,   标题:“Startup”,Detail:“Starting up”} 2016-12-29 17:57:32.297

     

+01:00 [信息] ActivityLogItem {Ip:“:: 1”,端口:“ - 1”,UserAgent:“Mozilla / 5.0”,StartRequest:12/29/2016 17:57:29,   EndRequest:12/29/2016 17:57:29}

我还在过滤器配置中使用ByIncludingOnly进行了尝试,结果是没有生成文件。

我的配置如何看起来serilog会登录某个类型的不同文件?

修改

我现在也尝试添加Matching.WithProperty

在我的课程ActivityLogItem中,我添加了一个新属性:

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

并将配置更改为

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

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

1 个答案:

答案 0 :(得分: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"));
相关问题