跟我一起學.NetCore之日志作用域及第三方日志框架擴展


前言

上一節對日志的部分核心類型進行簡單的剖析,相信現在再使用日志的時候,應該大概知道怎么一回事了,比如記錄器是怎么來的,是如何將日志內容寫入到不同目的地的等;當然還有很多細節沒深入講解,抽時間小伙伴們可以去研究研究;廢話不多說,接下來主要舉例演示日志作用域及第三方日志框架的擴展;

正文

說到日志作用域,相信很多小伙伴聽着不是那么熟悉吧,之前進行日志記錄時候,是不是把內容記錄下來就完事了,最多就是再稍微格式化一下;如果是這樣,那在排查問題的時候肯定差不多是這樣:一點一點的扒日志,然后根據關鍵詞找大概地方,再根據時間和內容定位排錯,更讓人頭大的是哪些日志是在同一個業務中產生的,哪些日志是在同一個請求中記錄的等等一系列煩惱;對於復雜的流程日志關聯時扒日志就更需要靠眼力了;

而日志作用域可以輔助排查和定位,所謂日志作用域,我是這么理解的,就是將日志記錄畫一個范圍,對應的業務邏輯記錄在指定的范圍內,這樣在排查業務邏輯的時候就減少對業務日志的歸屬分辨,從而快速定位對應請求或業務的相關日志內容;別那么多廢話,上例子......

來吧,一個WebAPI項目走起...

img

運行,然后嗖嗖嗖嗖按F5刷新幾次,如下:

img

懵了吧,很難辨別出哪些日志內容是同一個請求記錄的吧,那排錯分析就更加模糊了,就算日志加一些特殊的關鍵字區分,那排查效率也不高,對吧;其實對於請求而言,框架內部已經實現了,只需要配置開啟即可:

img

其他不動,運行項目,然后嗖嗖嗖嗖按F5刷新幾次,如下:

img

咋多了那么東西,每一次記錄,都把對應的請求ID等信息帶上了,可以清楚的看到日志是哪個請求的,其他信息而對於日志分析框架來說是很有用的;以上只是舉例控制台輸出案例,其他目的地也可以進行配置;

到這里肯定會有小伙伴問,那我一次請求里面有多個業務,咋區分呢?那先來稍微改一下代碼,增加了一個Action方法:

img

運行,再刷新

img

通過BeginScope可以開啟一個新的記錄作用域,根據對應業務進行記錄即可;這里的源碼實現就不具體說了,上一節簡單提了一下,如果需要詳細研究,可以私下繼續看看源碼;

由於框架本身內置的日志記錄,有時候滿足不了項目需求,比如需要將日志內容寫入到其他目的地,日志內容格式需自定義等,當然這些通過自己也可以實現,只要實現核心類型即可;但是成熟的第三方框架已經很多了,如NLog,Log4Net,Serilog等,別人已經把輪子造好了,咱們直接拿來用豈不美哉;

由於之前在博客里寫過一篇集成Log4Net的文章(去博客園吧https://www.cnblogs.com/zoe-zyq/p/12900636.html),這里就舉例演示一下集成Serilog吧,三步走:

  • 安裝依賴包;

    img

  • 配置文件;

    其實可以單獨做一個文件配置,但這里和appsettings寫在一塊了;

    img

  • 代碼編寫;

    img

    其他邏輯不用變,原來記錄日志的方式已經委托給Serilog框架進行日志記錄了;

    img

以上只是對Serilog簡單的配置和使用,如需詳細了解,請進入官網https://github.com/serilog/serilog/wiki/Configuration-Basics,文檔很全,說的也很詳細;

總結

對於日志的使用就簡單說到這吧,這節說的內容不多,也比較簡單,但有以下幾個建議:

  • 日志最好結構化存儲,便於檢索和分析;

  • 日志針對負責復雜即又關鍵的業務,最好加上作用域標識;

  • 日志記錄時避免記錄敏感信息;

  • 日志記錄時推薦以模板的形式進行記錄;

    // 模板形式,推薦
    _logger.LogInformation("TestLogger {content}", DateTime.Now);
    // 不推薦
    _logger.LogInformation($"TestLogger {DateTime.Now}", DateTime.Now)
    

下一節說說中間件~~~

------------------------------------------------

一個被程序搞丑的帥小伙,關注"Code綜藝圈",識別關注跟我一起學~~~

img


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM