我为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());
当我使用此配置进行日志记录时,会生成两个文件夹中的两个文件,但这些文件同时包含EventLogItem
和ActivityLogItem
的条目。
文件: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)
也被忽略了。记录器在两个指定的文件中写入两个条目。
答案 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"));