在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);
這樣我們可以看到相關的日誌輸出