生活随笔
收集整理的這篇文章主要介紹了
关于c#:Filter Serilog日志取决于上下文源到不同的接收器?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我有一個.NET Core 2.0應用程序,可以在其中成功使用Serilog進行日志記錄。現在,我想將一些數據庫性能統計信息記錄到一個單獨的接收器中(它們不是用于調試的,這基本上是應用程序中所有其他記錄的目的,因此我想將它們分開),并認為可以完成此操作 通過使用Log.ForContext()創建數據庫統計記錄器。
我不知道如何使用我的appsettings.json配置Serilog以將"調試日志"記錄到一個接收器,而將數據庫統計信息記錄到另一個接收器?我希望可以做類似的事情:
| "Serilog":?{ ?"WriteTo":?[ ? ??{ ? ? ?"Name":"RollingFile", ? ? ?"pathFormat":"logs/Log-{Date}.log", ? ? ?"Filter":?{ ? ? ? ?"ByExcluding":"FromSource(MyClass)" ? ? ??} ? ??}, ? ??{ ? ? ?"Name":"RollingFile", ? ? ?"pathFormat":"logs/DBStat-{Date}.log", ? ? ?"Filter":?{ ? ? ? ? ?"ByIncludingOnly":"FromSource(MyClass)" ? ? ??} ? ??} ??] } |
對我而言,配置的"Filter"部分純屬猜測。是否可以使用我的配置文件管理器執行此操作,還是需要在我的Startup.cs文件中的代碼中執行此操作?
編輯:我已經使用C#API使它工作,但仍然想使用JSON配置來弄清楚它:
| Log.Logger?=?new?LoggerConfiguration() ? ? ? ? ? ??.WriteTo.Logger(lc?=>?lc ? ? ? ? ? ? ? ??.Filter.ByExcluding(Matching.FromSource<MyClass>()) ? ? ? ? ? ? ? ??.WriteTo.LiterateConsole()) ? ? ? ? ? ??.WriteTo.Logger(lc?=>?lc ? ? ? ? ? ? ? ??.Filter.ByExcluding(Matching.FromSource<MyClass>()) ? ? ? ? ? ? ? ??.WriteTo.RollingFile("logs/DebugLog-{Date}.log")) ? ? ? ? ? ??.WriteTo.Logger(lc?=>?lc ? ? ? ? ? ? ? ??.Filter.ByIncludingOnly(Matching.FromSource<MyClass>()) ? ? ? ? ? ? ? ??.WriteTo.RollingFile("logs/DBStats-{Date}.log", outputTemplate:"{Message}{NewLine}")) ? ? ? ? ? ??.CreateLogger(); |
?相關討論
我今天完成了這項工作,并認為我會提供一個正確的答案,因為我花了很多篇文章,問題和其他頁面來解決問題。
擁有所有日志非常有用,但是我還想單獨記錄我的API代碼,并省略Microsoft.命名空間日志。進行此操作的JSON配置如下所示:
| ?"Serilog":?{ ? ?"Using":?["Serilog.Sinks.File"?], ? ?"MinimumLevel":"Debug", ? ?"WriteTo":?[ ? ? ??{ ? ? ? ?"Name":"File", ? ? ? ?"Args":?{ ? ? ? ? ?"path":"/var/logs/system.log", ? ? ? ? ??...?//other unrelated file config ? ? ? ??} ? ? ??}, ? ? ??{ ? ? ? ?"Name":"Logger", ? ? ? ?"Args":?{ ? ? ? ? ?"configureLogger":?{ ? ? ? ? ? ?"WriteTo":?[ ? ? ? ? ? ? ??{ ? ? ? ? ? ? ? ?"Name":"File", ? ? ? ? ? ? ? ?"Args":?{ ? ? ? ? ? ? ? ? ?"path":"/var/logs/api.log", ? ? ? ? ? ? ? ? ??...?//other unrelated file config ? ? ? ? ? ? ? ??} ? ? ? ? ? ? ??} ? ? ? ? ? ??], ? ? ? ? ? ?"Filter":?[ ? ? ? ? ? ? ??{ ? ? ? ? ? ? ? ?"Name":"ByExcluding", ? ? ? ? ? ? ? ?"Args":?{ ? ? ? ? ? ? ? ? ?"expression":"StartsWith(SourceContext, 'Microsoft.')" ? ? ? ? ? ? ? ??} ? ? ? ? ? ? ??} ? ? ? ? ? ??] ? ? ? ? ??} ? ? ? ??} ? ? ??} ? ??], ? ?"Enrich":?["FromLogContext","WithMachineName","WithThreadId"?] ? ??...?//Destructure and other config ??} |
頂級WriteTo是第一個簡單的全局接收器。所有日志事件都將寫入此內容。如果在與此相同的級別上添加Filter部分,它將影響所有已配置的WriteTo元素。
然后,我將另一個WriteTo配置為Logger(不是File),但是Args看上去與此不同,并且具有一個configureLogger元素,其作用與頂層的Serilog相同,即也就是說,它是子記錄器的頂層。這意味著您可以輕松地將此配置拆分為一個單獨的文件,并將其另外添加到配置構建器中(請參閱底部)。
從這里開始,此子記錄器的工作方式相同:您可以配置多個WriteTo,并且此級別上的Filter元素將僅影響此子記錄器。
只需將更多"Name":"Logger"元素添加到頂層WriteTo部分,并分別為每個元素設置過濾器。
注意
同樣重要的是要注意,即使您在config中完成所有這些操作,并且沒有在代碼中引用Serilog.Filters.Expressions包的任何一點,您仍然必須向該包添加NuGet引用。沒有軟件包參考,它將無法正常工作。
關于拆分配置:
如果必須添加更多的記錄器,為了清楚起見,我一定會將不同的記錄器分成單獨的文件,例如
appsettings.json:
| ?"Serilog":?{ ? ?"Using":?["Serilog.Sinks.File"?], ? ?"MinimumLevel":"Error", ? ?"WriteTo":?[ ? ? ??{ ? ? ? ?"Name":"File", ? ? ? ?"Args":?{ ? ? ? ? ?"path":"/var/logs/system.log", ? ? ? ? ??... ? ? ? ??} ? ? ??}, ? ? ??{ ? ? ? ?"Name":"Logger", ? ? ? ?"Args":?{ ? ? ? ? ?"configureLogger":?{}?// leave this empty ? ? ? ??} ? ? ??} ? ??], ? ?"Enrich":?["FromLogContext","WithMachineName","WithThreadId"?], ? ??... |
apilogger.json:
| { ?"Serilog:WriteTo:1:Args:configureLogger":?{???//notice this key ? ?"WriteTo":?[ ? ? ??{ ? ? ? ?"Name":"File", ? ? ? ?"Args":?{ ? ? ? ? ?"path":"/var/logs/api_separateFile.log", ? ? ? ? ??... ? ? ? ??} ? ? ??} ? ??], ? ?"Filter":?[ ? ? ??{ ? ? ? ?"Name":"ByExcluding", ? ? ? ?"Args":?{ ? ? ? ? ?"expression":"StartsWith(SourceContext, 'Microsoft.')" ? ? ? ??} ? ? ??} ? ??] ??} } |
然后調整我的IWebHost構建器以包括其他配置:
| ? ? WebHost.CreateDefaultBuilder(args) ? ? ? ??.ConfigureAppConfiguration((hostingContext, config)?=> ? ? ? ??{ ? ? ? ? ? ? config.AddJsonFile("apilogger.json", optional:?false, reloadOnChange:?false); ? ? ? ??}) ? ? ? ??.UseStartup<Startup>(); |
這樣,更易于理解,閱讀和維護。
總結
以上是生活随笔為你收集整理的关于c#:Filter Serilog日志取决于上下文源到不同的接收器?的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。