原文轉載自:http://www.cnblogs.com/zergcom/p/4527779.htmlhtml
前幾天就關注到湯姆大叔的相關文檔: 解讀ASP.NET 5 & MVC6系列(9):日誌框架.git
講的已經很清楚了, 這裏就不加累述了,那麼換一個角度,在實現方案和代碼開發方面談下本身的理解.github
ASP.NET 5的Logging我認爲其實就是2句話:app
Logging的使用其實就是依託2個基本接口: ILogger和ILoggerFactory.框架
Logging的實現其實就是經過實現不一樣的ILoggerProvider代理接口和其餘技術對接.ide
若是仍是不明白能夠看下目前Microsoft.Framework.Logging的源碼,就清楚了:函數
https://github.com/aspnet/Logging/tree/dev/srcui
咱們能夠看到Abstractions就是Logging的通用接口,而Console, Nlog和TraceSouce就是3個內部提供的代理類.目前可以使用的只有Console和TraceSource代理, 而NLog並無提交, 不過根據這裏面的代碼,我相信針對其餘Logging技術好比Log4Net,Serilog的代理類也並不難實現.spa
使用Logging框架一共分3步:代理
咱們仍是以最經典的Startup的Configurate函數爲例:
public void Configure(IApplicationBuilder app) { //利用最簡單的GetService函數獲取經過依賴注入獲取ILoggerFactory實現 var loggerfactory = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory)); //建立logger實例 var logger = loggerfactory.CreateLogger<Startup>(); //輸出一條Log信息 logger.LogWarning("這是一條警告信息"); }
那麼這些輸出的Log信息在那裏顯示呢,除了VS調試環境,很遺憾沒有任何地方能看到這些信息,這是由於標準的Logging實現不實現任何輸出,若是要想輸出,必須加入各類代理類把Log分發出去.
首先咱們加入引用:
"Microsoft.Framework.Logging.Console": "1.0.0-beta4"
其次咱們加入以下代碼
var loggerfactory = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory)); // 加入Console代理 loggerfactory.AddConsole(minLevel:LogLevel.Information);
代理在加入在項目中只須要加一次,通常就在Configure函數中加入便可. 加入以上代碼之後,全部從通用接口分發的Log信息都會顯示在程序控制臺上面,固然因爲設置了minLevel屬性,僅僅高於或等於Information等級的信息纔會被顯示.
若是僅僅是在控制檯顯示顯然是不過癮的,通常來講,咱們會把log輸出到文件,在目前的狀況下咱們只能經過TraceSource代理吧Log輸出到文件. TraceSource是System.Diagnostics中的主要內容,你們應該並不陌生.
首先咱們仍是須要加入一些組件
"Microsoft.Framework.Logging.TraceSource": "1.0.0-beta4"
若是要讓Core 5.0也支持,還必須加入
"System.Diagnostics.TextWriterTraceListener": "4.0.0-beta-22816"
實現的代碼是(開發時自行加入所需的using語句):
var loggerfactory = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory)); // Add trace source logger var logFileStream = new FileStream("app.log", FileMode.Append); var traceListenter = new TextWriterTraceListener(logFileStream) { Filter = new EventTypeFilter(SourceLevels.Error | SourceLevels.Critical) }; var source = new SourceSwitch("AppLog") { Level = SourceLevels.All }; loggerfactory.AddTraceSource(source, traceListenter);
根據以上代碼,全部Error和Critical的Log信息會被輸出到當前目錄的app.log文件中去,若是要顯示更多等級的信息請自行修改Filter.
該代理和Console同樣,也只須要運行一次,一樣建議在Configurate中運行.
其餘的代理類目前是沒有比較完整的實現,但咱們能夠預見到後續的實現方法其實並不難,就是:
這就是目前ASP.NET 5 所提供的Logging分發思路和實現方案.