原本log打算2天KO
不小心就給他寫了4天
昨天提到的 ILogger 物件就是由ILoggerFactory所建立的
ILoggerFactory.cs
public interface ILoggerFactory : IDisposable
{
ILogger CreateLogger(string categoryName);
void AddProvider(ILoggerProvider provider);
}
欸,這個ILogger CreateLogger(string categoryName); 似曾相似。
沒錯,在ILoggerProvider中也有這個方法。
那為什麼說昨天提到的ILogger物件是ILoggerFactory所建立的呢。
其實昨天提到的比較偏向預設實作為Logger的ILogger物件ILoggerFactory 所建立的ILogger (下面稱呼為 FactoryLogger)
實質上比較像由 ILoggerProvider 所建立 ILogger (下面稱呼為 ProviderLogger) 組合而成的
當FactoryLogger接收到要記錄的事件的時候,他會分發給所有註冊的 ProviderLogger
在分發之前,不同的ProviderLogger也可能會有不同的過濾行為
這些過濾也會由FactoryLogger所處理
講了這多,還是很模糊,我們來看看圖
這是簡易版UML沒有什麼作用,練習畫圖
圖要搭範例才有感覺,先看以下的程式
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new DebugLoggerProvider());
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Hello, World!");
我們先在建立一個 LoggerFactory 他是 ILoggerFactory的預設實作
並且添加了DebugLoggerProvider 的 ILoggerProvider。
然後透過loggerFactory.CreateLogger<Program>() 建立一個 categoryName 為 Program的ILogger
這時候背後的圖大Guy是這樣
如果我們今天再添加了一個新的ILoggerProvider
loggerFactory.AddProvider(new DebugLoggerProvider());
loggerFactory.AddProvider(new ConsoleLoggerProvider()); // ignore constructor
這時後會是
如果我們再添加一個category
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new ConsoleLoggerProvider());
loggerFactory.AddProvider(new DebugLoggerProvider());
var programLogger = loggerFactory.CreateLogger<Program>();
var myLogger = loggerFactory.CreateLogger("MyLogger");
programLogger.LogInformation("Hello, World!");
myLogger.LogInformation("Hello, World!");
就會變成醬子
注意到了嗎,當FactoryLogger Log的時候
會分配給底下ProviderLogger 進行Log 輸出到對應的管道