前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >log4net 自定义Layout日志字段

log4net 自定义Layout日志字段

作者头像
王清培
发布2018-01-08 10:23:00
1.3K0
发布2018-01-08 10:23:00
举报
文章被收录于专栏:王清培的专栏王清培的专栏

最近在使用log4net的时候有一个简单的需求,就是自定义个格式化输出符。这个输出符是专门用来帮我记录下业务ID、业务类型的。比如,“businessID:328593,businessType: orderID”。类似这样的输出日志。这些日志会被elk agent提取送到日志中心ES中,用来进行辅助排障。

简单的看了下log4net的PatternLayout和PatternConverter两个对象的作用,实现起来也是非常方便的。log4net有一组global的PatternLayout,这些全局的格式化对象是默认构造的时候就存在了,我们只需要提供对我们来说特殊场景的实现即可。

1
1

你所使用的所有常规的格式化输出都在全局的注册了。我们来实现自己的特殊用途的PatternLayout和PatternConverter,除此之外你还需要一个日志信息的载体对象,这里我使用BusinessIDLog类来存放。

代码语言:javascript
复制
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。明白了这个就很容易理解为什么配置一个格式化的字符串就可以得到自己的想要的文本。

代码语言:javascript
复制
namespace log4net.appender.demo 
{ 
    public class BusinessIDPatternLayout : log4net.Layout.PatternLayout 
    { 
       public BusinessIDPatternLayout() 
        { 
            this.AddConverter("businessID", typeof(BusinessIDPatternConvert)); 
        } 
    } 
}

实现一个PatternLayout就可以接管所有的格式化。这里的this.AddConverter,是将我们的businessID的Converter放入当前instance的作用域内。它不是全局的,而是当前实例局部的。

2
2

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

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

用户使用的时候需要传入BusinessIDLog对象,要不然我们的Converter对象无法获取到数据对象。

代码语言:javascript
复制
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了。

3
3

是不是很方便。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档