博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
log4net 自定义Layout日志字段
阅读量:7070 次
发布时间: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了。

是不是很方便。

作者:

出处:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

你可能感兴趣的文章
洛谷P3622 动物园
查看>>
Angular Encapsulation - css选择器选不到非angular组件(插件)
查看>>
iOS开发之UIScrollView
查看>>
mysql 使用 insert ignore into和unique实现不插入重复数据功能
查看>>
c++操作符重载_12
查看>>
eclipse 安装反编译工具
查看>>
我的Java开发学习之旅------>Java多线程下载文件 实例
查看>>
WireShark简单使用以及TCP三次握手
查看>>
什么是@guid
查看>>
nodeType的12种类型
查看>>
步步为营 .NET 代码重构学习笔记 十三
查看>>
053:Field的常用参数详解:
查看>>
读书笔记之SQL必知必会
查看>>
Jquery获取input表单的内容
查看>>
Paint、Canvas
查看>>
关于读写锁算法的java实现及思考
查看>>
最小堆排序
查看>>
iOS-网络爬虫
查看>>
jira
查看>>
elasticsearch rpm 安装
查看>>