iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Modern Web

擁抱 .Net Core系列 第 18

[Day17] .Net Core 中的Log - 4

  • 分享至 

  • xImage
  •  

原本log打算2天KO
不小心就給他寫了4天

ILoggerFactory

昨天提到的 ILogger 物件就是由ILoggerFactory所建立的

ILoggerFactory.cs

public interface ILoggerFactory : IDisposable
{
    ILogger CreateLogger(string categoryName);
    void AddProvider(ILoggerProvider provider);
}

欸,這個ILogger CreateLogger(string categoryName); 似曾相似。
沒錯,在ILoggerProvider中也有這個方法。

那為什麼說昨天提到的ILogger物件是ILoggerFactory所建立的呢。

其實昨天提到的比較偏向預設實作為LoggerILogger物件
ILoggerFactory 所建立的ILogger (下面稱呼為 FactoryLogger)
實質上比較像由 ILoggerProvider 所建立 ILogger (下面稱呼為 ProviderLogger) 組合而成的

FactoryLogger接收到要記錄的事件的時候,他會分發給所有註冊的 ProviderLogger
在分發之前,不同的ProviderLogger也可能會有不同的過濾行為
這些過濾也會由FactoryLogger所處理

講了這多,還是很模糊,我們來看看圖
這是簡易版UML沒有什麼作用,練習畫圖
https://ithelp.ithome.com.tw/upload/images/20220929/20109549tBLs3kfMdO.png

圖要搭範例才有感覺,先看以下的程式

var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new DebugLoggerProvider());
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Hello, World!");

我們先在建立一個 LoggerFactory 他是 ILoggerFactory的預設實作
並且添加了DebugLoggerProviderILoggerProvider
然後透過loggerFactory.CreateLogger<Program>() 建立一個 categoryName 為 ProgramILogger

這時候背後的圖大Guy是這樣
https://ithelp.ithome.com.tw/upload/images/20220929/20109549gzQajFzC0u.png

如果我們今天再添加了一個新的ILoggerProvider

loggerFactory.AddProvider(new DebugLoggerProvider());
loggerFactory.AddProvider(new ConsoleLoggerProvider()); // ignore constructor

這時後會是
https://ithelp.ithome.com.tw/upload/images/20220929/20109549Rnon3W2s0L.png

如果我們再添加一個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!");

就會變成醬子
https://ithelp.ithome.com.tw/upload/images/20220929/20109549vOvLEin6aD.png

注意到了嗎,當FactoryLogger Log的時候
會分配給底下ProviderLogger 進行Log 輸出到對應的管道


上一篇
[Day17] .Net Core 中的Log - 3
下一篇
[Day19] 中介軟體 Middleware - 1
系列文
擁抱 .Net Core30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言