.NET Core 提供了獨立的日誌模型,採用統一的 API 來完成日誌的記錄,支持各種內置日誌記錄器(如:Console、Debug、EventSource、EventLog、TraceSource 等 )和第三方日誌框架 (如: Log4Net、NLog、Loggr、Serilog、Sentry 等),同時基於日誌模型的擴展性,也可自定義更多的日誌記錄器。
三大核心對象
Logger
public interface ILogger
{
IDisposable BeginScope<TState>(TState state);
bool IsEnabled(LogLevel logLevel);
void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);
}
Logger
是實現 ILogger
接口的對象,包含 BeginScope
、IsEnabled
、Log
3 個方法,通過 IsEnabled
方法判斷當前 Logger
是否支持指定的日誌等級,如果不支持則會忽略這條日誌。BeginScope
主要是方便日誌追蹤使用,通過 BeginScope
可定義一個區間範圍內的日誌統一標識。
LoggerProvider
public interface ILoggerProvider : IDisposable
{
ILogger CreateLogger(string categoryName);
}
LoggerProvider
是實現 ILoggerProvider
接口的對象,日誌寫入目的地的最終實現者。LoggerProvider
只含 CreateLogger
方法,該方法返回當前 Provider 的具體 Logger
對象。
LoggerFactory
public interface ILoggerFactory : IDisposable
{
void AddProvider(ILoggerProvider provider);
ILogger CreateLogger(string categoryName);
}
LoggerFactory
是實現 ILoggerFactory
接口的對象,LoggerFactory
包含 AddProvider
和 CreateLogger
2 個方法,通過 AddProvider
註冊 LoggerProvider
對象,通過 CreateLogger
創建指定名稱的 Logger
對象。
關於 LoggerFactory
中提供的創建 Logger
的方法和 LoggerProvider
中提供的創建 Logger
的方法是不一樣的,LoggerFactory
創建的 Logger
對象主要是日誌記錄統一入口,實際最終是委託 LoggerProvider
創建的 Logger
對象來記錄日誌,如果 LoggerFactory
中註冊了多個 LoggerProvider
,那就分別會調用其 Logger
對象來記錄日誌,點擊查看源碼 。
三者之間的關係圖如下:
日誌等級
在 Logger
對象的 Log
方法中必須傳入日誌等級參數 LogLevel
,所以每條記錄的日誌都必須有日誌等級標記。具體枚舉值如下:
public enum LogLevel
{
Trace = 0,
Debug = 1,
Information = 2,
Warning = 3,
Error = 4,
Critical = 5,
None = 6
}
枚舉值決定等級高低,值越大,等級越高,等級越高,重要程度越大。比如在程序開發中,有的日誌只是爲了記錄執行過程,方便後續分析判斷,有的日誌是記錄程序異常,一般需要及時處理,這時就需要通過日誌等級來做一些區分。同時日誌等級可以方便 LoggerProvider
對日誌進行過濾,比如某些 LoggerProvider
只關注日誌級別是 Error
以上,就可以通過指定 LogLevel
來限定。
代碼示例
static void Main(string[] args)
{
ILogger logger = new LoggerFactory()
.AddConsole(LogLevel.Warning)
.AddDebug()
.CreateLogger(nameof(Program));
logger.LogInformation("Information 日誌");
logger.LogWarning("Warning 日誌");
logger.LogError("Error 日誌");
Console.ReadKey();
}
向 LoggerFactory
註冊了 Console
和 Debug
2個內置的 LogProvider
(之後將有文章介紹部分第三方日誌框架的使用),同時指定 ConsoleProvider
過濾的日誌等級必須是 Warning
及更高。
結果如下,控制檯輸出 2 條日誌,調試窗口輸出 3 條日誌: