`
wenhai_zhang
  • 浏览: 181652 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Log4j显示线程ID

    博客分类:
  • java
 
阅读更多

问题:

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

 

分析:

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

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

 

解决:

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

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

 

1.拓展Log4j的PatternParser

代码:

package org.apache.log4j;

import org.apache.log4j.helpers.FormattingInfo;
import org.apache.log4j.helpers.PatternConverter;
import org.apache.log4j.helpers.PatternParser;
import org.apache.log4j.spi.LoggingEvent;

public class ExPatternParser extends PatternParser {
	 
	 public ExPatternParser(String pattern) {
	   super(pattern);
	  }
	 
	 /**
	   * 重写finalizeConverter,对特定的占位符进行处理,T表示线程ID占位符
	   */
	  @Override
	  protected void finalizeConverter(char c) {
	   if (c == 'T') {
	    this.addConverter(new ExPatternConverter(this.formattingInfo));
	   } else {
	    super.finalizeConverter(c);
	   }
	  }
	 
	 private static class ExPatternConverter extends PatternConverter {
	 
	  public ExPatternConverter(FormattingInfo fi) {
	    super(fi);
	   }
	 
	  /**
	    * 当需要显示线程ID的时候,返回当前调用线程的ID
	    */
	   @Override
	   protected String convert(LoggingEvent event) {
	    return String.valueOf(Thread.currentThread().getId());
	   }
    }
}

  

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

代码:

package org.apache.log4j;

import org.apache.log4j.PatternLayout;
import org.apache.log4j.helpers.PatternParser;

public class ExPatternLayout extends PatternLayout {
	 
	 public ExPatternLayout(String pattern) {
	   super(pattern);
	  }
	 
	 public ExPatternLayout() {
	   super();
	  }
	  
	  /**
	   * 重写createPatternParser方法,返回PatternParser的子类
	   */
	  @Override
	  protected PatternParser createPatternParser(String pattern) {
	   return new ExPatternParser(pattern);
	  }
	 }

 

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

#设置输出样式  
log4j.appender.appender1.layout=org.apache.log4j.ExPatternLayout  

 

4.运行程序。

分享到:
评论

相关推荐

    log4j.ex.jar(包含源码)

    多线程环境下使用log4j输出各线程的线程ID作为标识,区分各线程输出的内容 具体可以参考:http://blog.csdn.net/benq998/archive/2009/03/29/4033334.aspx

    rl-log-connector:Redpill Linpro Log Connector简化了Mule应用程序中Log4j2线程上下文的处理

    它允许自动将应用程序名称,消息ID和关联ID注入线程上下文。 ule子支持的版本 ule子3.8.x,3.9.x Log4j2支持的版本 Log4j 2.x 安装 对于beta连接器,您可以下载源代码并使用devkit进行构建,以在本地存储库中找到...

    Java应用日志框架TNT4J.zip

    TNT4J是一个改进Log4J新的开源Java应用日志框架。用于应用程序活动的跟踪、相关性检查、诊断,可以跨多个应用程序,运行时,服务器,地理的位置。这个API是专门用以解决分布式,并发,多线程,多用户应用,包括活动...

    Java NIO+多线程实现聊天室

    log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣电影的图片,并打成压缩包传输给客户端 客户端使用方式: 登录:默认用户名是user1-user5...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - log4j+slf4j日志 - 实现的功能 - 登录注销 - 单聊 - 群聊 - 客户端提交任务,下载图片并显示 - 上线下线公告 - 在线用户记录 - 批量下载豆瓣电影的图片,并打为压缩包传输给客户端 - 客户端使用方式: ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...

    MySQL 5.1参考手册

    5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL...

    oracle数据库经典题目

    系统触发器主要是DML事件和系统事件发生时调用的触发器,其中DML事件包括CREATE、DROP、ALTER等,系统事件包括LOGON、LOGOFF、STARTUP、SHUTDOWN、SERVERERROR等。 9.简述Oracle数据库角色的种类、作用,以及如何...

    MySQL5.1参考手册官方简体中文版

    5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL...

    新版Android开发教程.rar

    四频 (850 , 900 , 1800 , 1900) ;支持 3G , 802.11b 和 802.11g 。----------------------------------- Android 编程基础 5 互联网 支持 HTTP 、 WAP Push 和 xHTML ;支持 POP 、 IMAP 、 SMTP ,以及 AOL ...

    mysql官方中文参考手册

    5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL...

    MYSQL中文手册

    5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. ...

    MySQL 5.1参考手册中文版

    5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. ...

    mysql5.1中文手册

    mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM日志文件内容 8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言...

    java微信公众号MVC开发框架

    如果没有配置encodingAESKey,那么是不能处理加密消息的,如果有log4j的配置文件,启动阶段会给出告警信息的。 同一个公众号可以配置多个@Weixin注解控制器类,其中只需要一个有其他4项配置就可以了,如果多个控制...

Global site tag (gtag.js) - Google Analytics