2016-12-29 65 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"));