標籤:log4net log4net自訂layout
最近在使用log4net的時候有一個簡單的需求,就是自訂個格式化輸出符。這個輸出符是專門用來幫我記錄下業務ID、業務類型的。比如,“businessID:328593,businessType: orderID”。類似這樣的輸出日誌。這些日誌會被elk agent提取送到日誌中心ES中,用來進行輔助排障。
簡單的看了下log4net的PatternLayout和PatternConverter兩個對象的作用,實現起來也是非常方便的。log4net有一組global的PatternLayout,這些全域的格式化對象是預設構造的時候就存在了,我們只需要提供對我們來說特殊情境的實現即可。
650) this.width=650;" title="1" style="border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;padding-right:0px;border-top-width:0px;" border="0" alt="1" src="http://s3.51cto.com/wyfs02/M01/8A/72/wKioL1gxGW-yaKjWAAC07xGI1S8184.png" width="861" height="545" />
你所使用的所有常規的格式化輸出都在全域的註冊了。我們來實現自己的特殊用途的PatternLayout和PatternConverter,除此之外你還需要一個日誌資訊的載體對象,這裡我使用BusinessIDLog類來存放。
using System.IO; using log4net.Layout.Pattern; using log4net.Core;namespace log4net.appender.demo { public class BusinessIDPatternConvert : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { var businessID = loggingEvent.MessageObject as BusinessIDLog; if (businessID == null) return; writer.Write(string.Format(" businessID:{0},businessType:{1}", businessID.ID,businessID.BusinessType)); } } }
在log4net裡面,每一個特殊的格式符都是一個converter。明白了這個就很容易理解為什麼配置一個格式化的字串就可以得到自己的想要的文本。
namespace log4net.appender.demo { public class BusinessIDPatternLayout : log4net.Layout.PatternLayout { public BusinessIDPatternLayout() { this.AddConverter("businessID", typeof(BusinessIDPatternConvert)); } } }
實現一個PatternLayout就可以接管所有的格式化。這裡的this.AddConverter,是將我們的businessID的Converter放入當前instance的範圍內。它不是全域的,而是當前執行個體局部的。
650) this.width=650;" title="2" style="border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;padding-right:0px;border-top-width:0px;" border="0" alt="2" src="http://s3.51cto.com/wyfs02/M02/8A/76/wKiom1gxGXDgMwlpAABL8DJ0kdw088.png" width="912" height="410" />
然後在你的log4net的設定檔中配置你自訂的PatternLayout。
<!--日誌格式-->
<layout type="log4net.appender.demo.BusinessIDPatternLayout">
<conversionPattern value="%date [%t]%-5level %c [%businessID] %n"/>
</layout>
使用者使用的時候需要傳入BusinessIDLog對象,要不然我們的Converter對象無法擷取到資料對象。
namespace log4net.appender.demo{ class Program { static void Main(string[] args) { var loger = LogManager.GetLogger(typeof(Program)); loger.Info(new BusinessIDLog() { ID = "25434535", BusinessType = "orderID" }); } }}
這樣就OK了。
650) this.width=650;" title="3" style="border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;padding-right:0px;border-top-width:0px;" border="0" alt="3" src="http://s3.51cto.com/wyfs02/M00/8A/76/wKiom1gxGXDDcHgxAABp_ECHICY115.png" width="959" height="142" />
是不是很方便。
本文出自 “謙虛若愚、求知如渴” 部落格,請務必保留此出處http://wangqingpei557.blog.51cto.com/1009349/1874721
log4net 自訂Layout日誌欄位