2016-12-29 127 views
1

我已经为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的条目。

文件:活动\登录-2016 ....登录

2016年12月29日17:36:47.610 01:00 [信息] EventLogItem {ID: 00000000-0000- 0000-0000-000000000000,时间戳:01/01/0001 00:00:00, 标题:“启动”,详细信息:“启动”} 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}

文件:活动\日志-2016 ....登录

2016年12月29日17:36:47.610 01:00 [信息] EventLogItem {ID: 00000000-0000 -0000-0000-000000000000,时间戳:01/01/0001 00:00:00, 标题:“启动”,明细:“启动”} 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,导致没有生成文件。

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

编辑:

我也试了一下,现在加入了Matching.WithProperty

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

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

,并改变了配置

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

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

+0

可能重复。尝试http://stackoverflow.com/a/38785632/3762855 –

+0

@CroCorvino我已经尝试过,并试图用'Matching.WithProperty'也有相同的结果,记录器写入这两个文件 – Mark

+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"));