天天看點

log4net 自定義Layout日志字段

最近在使用log4net的時候有一個簡單的需求,就是自定義個格式化輸出符。這個輸出符是專門用來幫我記錄下業務ID、業務類型的。比如,“businessID:328593,businessType: orderID”。類似這樣的輸出日志。這些日志會被elk agent提取送到日志中心ES中,用來進行輔助排障。

簡單的看了下log4net的PatternLayout和PatternConverter兩個對象的作用,實作起來也是非常友善的。log4net有一組global的PatternLayout,這些全局的格式化對象是預設構造的時候就存在了,我們隻需要提供對我們來說特殊場景的實作即可。

log4net 自定義Layout日志字段

你所使用的所有正常的格式化輸出都在全局的注冊了。我們來實作自己的特殊用途的PatternLayout和PatternConverter,除此之外你還需要一個日志資訊的載體對象,這裡我使用BusinessIDLog類來存放。

  

在log4net裡面,每一個特殊的格式符都是一個converter。明白了這個就很容易了解為什麼配置一個格式化的字元串就可以得到自己的想要的文本。

實作一個PatternLayout就可以接管所有的格式化。這裡的this.AddConverter,是将我們的businessID的Converter放入目前instance的作用域内。它不是全局的,而是目前執行個體局部的。

log4net 自定義Layout日志字段

然後在你的log4net的配置檔案中配置你自定義的PatternLayout。

<!--日志格式--> 

      <layout type="log4net.appender.demo.BusinessIDPatternLayout"> 

        <conversionPattern value="%date [%t]%-5level %c [%businessID] %n"/> 

      </layout>

使用者使用的時候需要傳入BusinessIDLog對象,要不然我們的Converter對象無法擷取到資料對象。

這樣就OK了。

log4net 自定義Layout日志字段

是不是很友善。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面