博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
log4net 自定义Layout日志字段
阅读量:7020 次
发布时间:2019-06-28

本文共 1966 字,大约阅读时间需要 6 分钟。

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

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

你所使用的所有常规的格式化输出都在全局的注册了。我们来实现自己的特殊用途的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的作用域内。它不是全局的,而是当前实例局部的。

然后在你的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了。

是不是很方便。

你可能感兴趣的文章
js 图表插件 chartjs 2.4
查看>>
Python之登录
查看>>
SVG.js Mask覆盖和ClipPath裁剪
查看>>
Python多线程之线程创建和终止
查看>>
通过JS语句判断WEB网站的访问端是电脑还是手机
查看>>
(8) iphone 开发 数据传递 : 02 页面切换与数据的反向传递
查看>>
LPC3250 External Memory Controller
查看>>
MySQL内存表的弊端
查看>>
使用SIMILE Timeline 将邮件“事件”可视化
查看>>
SQL:创建某一时间段内的周末日期表以及特殊处理日期表
查看>>
什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?(转)
查看>>
LindAgile.SchedulingTask~设计一个不错的任务调度组件
查看>>
恶搞之手机垃圾信息发送器 手机短信骚扰器
查看>>
mysql replication之binlog-do-db、binlog-ignore-db
查看>>
Date类型和Long类型的相互转换
查看>>
XMPP协议
查看>>
CSS:给 input 中 type="text" 设置CSS样式
查看>>
Softmax函数
查看>>
hdu4462 Scaring the Birds
查看>>
设计中的道理_6
查看>>