溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

log4net 自定義Layout日志字段

發(fā)布時(shí)間:2020-06-16 06:07:13 來(lái)源:網(wǎng)絡(luò) 閱讀:1871 作者:王清培 欄目:編程語(yǔ)言

最近在使用log4net的時(shí)候有一個(gè)簡(jiǎn)單的需求,就是自定義個(gè)格式化輸出符。這個(gè)輸出符是專(zhuān)門(mén)用來(lái)幫我記錄下業(yè)務(wù)ID、業(yè)務(wù)類(lèi)型的。比如,“businessID:328593,businessType: orderID”。類(lèi)似這樣的輸出日志。這些日志會(huì)被elk agent提取送到日志中心ES中,用來(lái)進(jìn)行輔助排障。

簡(jiǎn)單的看了下log4net的PatternLayout和PatternConverter兩個(gè)對(duì)象的作用,實(shí)現(xiàn)起來(lái)也是非常方便的。log4net有一組global的PatternLayout,這些全局的格式化對(duì)象是默認(rèn)構(gòu)造的時(shí)候就存在了,我們只需要提供對(duì)我們來(lái)說(shuō)特殊場(chǎng)景的實(shí)現(xiàn)即可。

log4net 自定義Layout日志字段

你所使用的所有常規(guī)的格式化輸出都在全局的注冊(cè)了。我們來(lái)實(shí)現(xiàn)自己的特殊用途的PatternLayout和PatternConverter,除此之外你還需要一個(gè)日志信息的載體對(duì)象,這里我使用BusinessIDLog類(lèi)來(lái)存放。

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里面,每一個(gè)特殊的格式符都是一個(gè)converter。明白了這個(gè)就很容易理解為什么配置一個(gè)格式化的字符串就可以得到自己的想要的文本。

namespace log4net.appender.demo    
{     
    public class BusinessIDPatternLayout : log4net.Layout.PatternLayout     
    {     
       public BusinessIDPatternLayout()     
        {     
            this.AddConverter("businessID", typeof(BusinessIDPatternConvert));     
        }     
    }     
}

   

實(shí)現(xiàn)一個(gè)PatternLayout就可以接管所有的格式化。這里的this.AddConverter,是將我們的businessID的Converter放入當(dāng)前instance的作用域內(nèi)。它不是全局的,而是當(dāng)前實(shí)例局部的。

log4net 自定義Layout日志字段

然后在你的log4net的配置文件中配置你自定義的PatternLayout。

<!--日志格式-->    
      <layout type="log4net.appender.demo.BusinessIDPatternLayout">    
        <conversionPattern value="%date [%t]%-5level %c [%businessID] %n"/>    
      </layout>

用戶(hù)使用的時(shí)候需要傳入BusinessIDLog對(duì)象,要不然我們的Converter對(duì)象無(wú)法獲取到數(shù)據(jù)對(duì)象。

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了。

log4net 自定義Layout日志字段

是不是很方便。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI