在Winform項目和Web API的.NetCore項目中使用Serilog 來記錄日誌信息

在我們常規的調試或者測試的時候,喜歡把一些測試信息打印在控制台或者記錄在文件中,對於.netframework項目來說,我們輸出控制台的日誌信息習慣的用Console.WriteLine來輸出查看,不過對於.netcore的項目來說,這種輸出看不到任何信息了,不過即使這樣,我們建議還是把一些測試的日誌記錄在文件中,供查看對比。本篇隨筆介紹使用Serilog 來記錄日誌信息,包括應用於.netframework項目和.netcore項目中都適合。

1、在Winform項目中整合Serilog 記錄日誌

在.NET使用日誌框架第一時間會想到NLog或是Log4Net,Serilog 是這幾年快速崛起的Log框架之一,Serilog是以Structured logging 為基礎進行設計,通過logging API 可以輕鬆的記錄應用程序中對象屬性,方便快速進行logging 內容進行查詢與分析,並將其紀錄內容通過json (可指定) 的方式輸出。

不管對於.netframwork或者.netcore的Winform項目來說,使用Serilog 來記錄日誌信息的操作都很類似,它都支持的。

官網地址://serilog.net/,或者參考它的Github地址://github.com/serilog/serilog 

  我們只需要引入對應的幾個Serilog 相關DLL即可,如下所示。

 然後在Main函數中添加對應的處理代碼,如下所示。

    static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()
                .WriteTo.Console()
                .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
                .CreateLogger();

在類代碼或者界面代碼中,直接通過方法輸出日誌信息即可。

   //使用Serilog記錄日誌信息
   Serilog.Log.Information(json);

它和其他Log組件,如Log4net一樣,它的使用區分類別來輸出不同類型的日誌,支持Verbose、Debug、Information、Error、Warning、Fatal 幾個接口的輸出。

Serilog.Log.Verbose("verbose"); // 用於跟蹤信息和調試細節,不會輸出顯示出來

//以下為常用記錄日誌方法
Serilog.Log.Information("info");
Serilog.Log.Debug("debug");
Serilog.Log.Warning("warning");
Serilog.Log.Error("err");
Serilog.Log.Fatal("fatal"); 

 輸出日誌信息如下所示。

 Serilog 如果想個性化設置日誌輸出到什麼地方,需要引用一些serilog的接收器。Serilog的輸出對象稱之為Sink

 Github上提供了大量的Serilog 第三方的可用sinks,這裡簡單的列舉幾個常用的:

 

2、在.NetCore項目的Web API中整合Serilog 

 在.netcore的Web API項目中配置和上面的有一些差異,引入相關的Serilog組件類庫,如下所示。

 

 其中需要在IHostBuilder或者IWebHostBuilder中注入Serilog接口,如下初始化代碼所示。

 

 在Web API的控制器中使用代碼如下所示

    /// <summary>
    /// 用於接收長語音信息回調的處理
    /// </summary>
    [ApiController]
    [Route("[controller]")]
    public class LongVoiceController : ControllerBase
    {
        private readonly ILogger<LongVoiceController> _logger;

        public LongVoiceController(ILogger<LongVoiceController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// 測試控制器,路由:get /longvoice
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public List<string> TestList()
        {
            return new List<string>()
            {
                "測試列表接口",
                "檢查控制器正常"
            };
        }

        /// <summary>
        /// 回調寫入結果, 路由:post /longvoice
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<CommonResultDto> CallBack(LongVoiceResultDto input)
        {
            CommonResultDto result = null;
            var json = JsonConvert.SerializeObject(input, Formatting.Indented);
            _logger.LogInformation(json);

            result = new CommonResultDto(0, "操作成功");
            return await Task.FromResult(result);
        }
    }

我們注意到直接使用web API 的 IIogger<T>接口調用寫日誌即可。

_logger.LogInformation(json);

這樣我們可以看到相關的日誌輸出