使用忽略的过滤器登录多个文件
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());
当我使用此配置登录时,两个文件夹中的两个文件都会生成,但这些文件包含 EventLogItem
和 ActivityLogItem
.
的条目
文件: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"));
我已经为一个 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..日志
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"));