ASP.NET Core 日誌模型

.NET Core 提供了獨立的日誌模型,採用統一的 API 來完成日誌的記錄,支持各種內置日誌記錄器(如:Console、Debug、EventSource、EventLog、TraceSource 等 )和第三方日誌框架 (如: Log4NetNLogLoggrSerilogSentry 等),同時基於日誌模型的擴展性,也可自定義更多的日誌記錄器。

三大核心對象

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 接口的對象,包含 BeginScopeIsEnabledLog 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 包含 AddProviderCreateLogger 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 註冊了 ConsoleDebug 2個內置的 LogProvider之後將有文章介紹部分第三方日誌框架的使用),同時指定 ConsoleProvider 過濾的日誌等級必須是 Warning 及更高。

結果如下,控制檯輸出 2 條日誌,調試窗口輸出 3 條日誌:

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章