天天看點

ASP.NET 5 入門 (3) – Logging

ASP.NET 5 了解和入門

建立和開發ASP.NET 5 項目

使用自定義配置檔案

ASP.NET 5 入門 (3) – Logging

前幾天就關注到湯姆大叔的相關文檔: 解讀ASP.NET 5 & MVC6系列(9):日志架構.

講的已經很清楚了, 這裡就不加累述了,那麼換一個角度,在實作方案和代碼開發方面談下自己的了解.

了解ASP.NET5的Logging

ASP.NET 5的Logging我認為其實就是2句話:

  • Logging的使用: 應用内部的Logging統一使用Microsoft.Framework.Logging接口.
  • Logging的實作: 通過不同的代理類向不同的Logging實作技術分發應用内部産生的Log.

Logging的使用其實就是依托2個基本接口:  ILogger和ILoggerFactory.

Logging的實作其實就是通過實作不同的ILoggerProvider代理接口和其他技術對接.

如果還是不明白可以看下目前Microsoft.Framework.Logging的源碼,就清楚了:

https://github.com/aspnet/Logging/tree/dev/src

ASP.NET 5 入門 (3) – Logging

我們可以看到Abstractions就是Logging的通用接口,而Console, Nlog和TraceSouce就是3個内部提供的代理類.目前能夠使用的隻有Console和TraceSource代理, 而NLog并沒有送出, 不過根據這裡面的代碼,我相信針對其他Logging技術比如Log4Net,Serilog的代理類也并不難實作.

如何使用通用Logging架構

使用Logging架構一共分3步:

  1. 使用依賴注入擷取ILoggerFactory實作.
  2. 利用ILoggerFactory建構ILogger執行個體
  3. 使用ILogger執行個體輸出Log資訊.

我們還是以最經典的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分發出去.

加入Console代理

首先我們加入引用:

"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等級的資訊才會被顯示.

加入TraceSource代理

如果僅僅是在控制台顯示顯然是不過瘾的,一般來說,我們會把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中運作.

其他代理的實作展望

其他的代理類目前是沒有比較完整的實作,但我們可以預見到後續的實作方法其實并不難,就是:

  • 首先引入你使用的第三方Log實作,比如Log4Net,NLog,Serilog等.
  • 然後引入或者自行開發代理類, 一般這個代理類會為ILoggerFactory實作一個擴充函數 AddXXX() : 比如AddNlog , AddLog4Net , AddSeriLog 等等.
  • 最後在Configutate函數中調用這個擴充函數AddXXX() 函數把标準Logging分發到該第三方Log實作.

這就是目前ASP.NET 5 所提供的Logging分發思路和實作方案.

軟體開發,項目管理,開發管理,團隊管理.

CMMI,PMP