Log4j 拓展显示线程ID

原文:http://wenhai.iteye.com/blog/2037765


问题:

在进行多线程编程时,经常会在调试信息中看到线程的处理流程,需要在日志中体现当前线程信息。因Java中的线程名称采用了默认的“Thread-1”等字符串,定位不方便。

 

分析:

在JDK1.5开始对Thread类加入了getId()方法,即每个线程都有一个唯一的数字来代替。

在记录日志时,是否可以通过记录线程ID来提升日志线程信息的清晰度?

 

解决:

Log4j默认只提供了对线程名称的现实,即使用占位符%t来显示名称。

如果需要显示线程ID,需要拓展log4j。

 

1.拓展Log4j的PatternParser

代码:

Java代码   收藏代码
  1. package org.apache.log4j;  
  2.   
  3. import org.apache.log4j.helpers.FormattingInfo;  
  4. import org.apache.log4j.helpers.PatternConverter;  
  5. import org.apache.log4j.helpers.PatternParser;  
  6. import org.apache.log4j.spi.LoggingEvent;  
  7.   
  8. public class ExPatternParser extends PatternParser {  
  9.        
  10.      public ExPatternParser(String pattern) {  
  11.        super(pattern);  
  12.       }  
  13.        
  14.      /** 
  15.        * 重写finalizeConverter,对特定的占位符进行处理,T表示线程ID占位符 
  16.        */  
  17.       @Override  
  18.       protected void finalizeConverter(char c) {  
  19.        if (c == 'T') {  
  20.         this.addConverter(new ExPatternConverter(this.formattingInfo));  
  21.        } else {  
  22.         super.finalizeConverter(c);  
  23.        }  
  24.       }  
  25.        
  26.      private static class ExPatternConverter extends PatternConverter {  
  27.        
  28.       public ExPatternConverter(FormattingInfo fi) {  
  29.         super(fi);  
  30.        }  
  31.        
  32.       /** 
  33.         * 当需要显示线程ID的时候,返回当前调用线程的ID 
  34.         */  
  35.        @Override  
  36.        protected String convert(LoggingEvent event) {  
  37.         return String.valueOf(Thread.currentThread().getId());  
  38.        }  
  39.     }  
  40. }  

  

 2.拓展PatternLayout类,使用拓展的ExPatternParser类

代码:

Java代码   收藏代码
  1. package org.apache.log4j;  
  2.   
  3. import org.apache.log4j.PatternLayout;  
  4. import org.apache.log4j.helpers.PatternParser;  
  5.   
  6. public class ExPatternLayout extends PatternLayout {  
  7.        
  8.      public ExPatternLayout(String pattern) {  
  9.        super(pattern);  
  10.       }  
  11.        
  12.      public ExPatternLayout() {  
  13.        super();  
  14.       }  
  15.         
  16.       /** 
  17.        * 重写createPatternParser方法,返回PatternParser的子类 
  18.        */  
  19.       @Override  
  20.       protected PatternParser createPatternParser(String pattern) {  
  21.        return new ExPatternParser(pattern);  
  22.       }  
  23.      }  

 

3.修改Log4j的配置文件,将输出样式修改为拓展类ExPatternLayout

Java代码   收藏代码
  1. #设置输出样式    
  2. log4j.appender.appender1.layout=org.apache.log4j.ExPatternLayout    

 

4.运行程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值