`
wenhai_zhang
  • 浏览: 185889 次
  • 性别: 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多线程实践-LogTest

    - 然后,我们配置Log4j的`PatternLayout`,使其包含ThreadContext中的键值对,比如`%X{threadId}`,这会将线程ID插入到日志记录中。 - 配置一个FileAppender,其文件名包含ThreadContext的值,从而确保每个线程...

    Log4j2实现不同线程不同级别日志输出到不同的文件中

    Log4j2通过`ThreadContext`类提供此功能,可以将特定于线程的信息(如用户ID、事务ID)存储在其中,并在日志消息中携带这些信息。 3. **定制日志配置**: - 要实现不同线程的日志分别输出,我们需要创建一个自定义...

    log4j实用配置扩展

    #### 四、log4j的核心组件 log4j的核心组件主要包括**Loggers(记录器)**、**Appenders(输出源)**和**Layouts(布局)**。 1. **Loggers (记录器)**:负责生成日志信息,并决定是否发送日志信息到Appenders。记录器...

    Log4J完整说明和配置

    - `ConversionPattern`:定义输出的格式,例如`[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n`表示输出的信息包括框架名称、日期、线程ID等。 ##### 3.4 文件输出Appender ```properties log4j.appender.FILE=org.apache...

    log4j自定义日志文件名及日志输出格式

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...

    log4j教程

    3. **Layout的配置**:定义日志的输出格式,如日期、线程ID、日志级别、日志消息等。 #### 实践示例 假设我们想要配置Log4j以将日志同时输出到控制台和文件,并且希望文件达到一定大小后自动创建新文件。这样的...

    Log4j详解与实战

    - 自定义Layout,可以创建自己的日志格式,包含更多的调试信息,如线程ID、类名等。 6. **日志滚动** - DailyRollingFileAppender允许日志文件按天滚动,防止单个日志文件过大。 7. **日志性能** - Log4j的性能...

    log4j使用实例.zip

    例如,可以创建一个网络Appender将日志发送到远程服务器,或者定义一个特殊的Layout格式,包含更丰富的日志信息,如线程ID、堆栈跟踪等。 4. **日志等级管理** 通过配置文件,你可以控制不同级别的日志输出。在...

    AndroidStudio 使用log4j记录日志,按照大小定期滚动日志Demo

    你可以根据需要自定义格式,比如增加线程ID、源代码行号等信息。 5. **运行与调试** 在Android Studio中运行应用,日志将在指定的文件路径下生成,同时控制台也会显示日志信息。在实际开发中,可能需要根据应用的...

    Log4j的中文帮助文档

    #### 四、Log4j核心组件 - **记录器(Loggers)** - 记录器是日志系统的基石,负责记录日志信息。 - 通过指定不同的级别和过滤条件来控制哪些信息会被记录下来。 - 记录器采用层级结构命名,如`com.example.app`...

    android log4j资源上传

    - 在Android中使用log4j需要解决与Android SDK兼容性的问题,因为log4j依赖于Java的反射和线程API,而Android对这些API有所限制。 - 可以通过第三方库,如log4android或android-log4j,它们是专门为Android优化的...

    log4j-1.2.17

    例如,可以创建一个将日志发送到远程服务器的Appender,或者定制一个包含额外信息(如线程ID、类名等)的布局。 总结来说,Log4j-1.2.17是Java开发中的重要工具,它提供了一套全面的日志解决方案,帮助开发者轻松地...

    log4j自定义

    《深入理解Log4j自定义》 在Java开发中,日志系统扮演着至关重要的角色,它能够帮助我们记录程序运行过程中的各种信息,便于调试、监控和问题排查。Log4j作为一款广泛使用的日志框架,其强大的可配置性和自定义能力...

    log4j常用配置详解

    ### log4j常用配置详解 ### #### 一、log4j.properties 配置解析 #### 在Java开发领域中,log4j是一款非常流行的日志框架,它提供了丰富的配置选项来满足不同场景下的日志记录需求。本文将详细介绍两种常见的log4j...

    Log4j手册

    PatternLayout是最常用的,因为它允许开发者自定义日志消息的输出格式,如包含日期、时间、线程ID、日志级别、类名、方法名等信息。 #### 5. 配置与初始化 Log4j的配置可以通过XML、properties或JNDI进行。配置...

    Log4j写入数据库详解

    ### Log4j写入数据库详解 #### 一、Log4j简介 Log4j是一个流行的开源日志框架,由Apache Software Foundation开发维护。它提供了一种灵活的方式来控制日志的生成,使得日志的级别、格式以及输出目的地都可以在运行...

    apache-log4j-2.6.2.jar包

    8. **日志上下文(Log Context)**:Log4j 2引入了ThreadContext和MDC(Mapped Diagnostic Context),允许在日志中添加额外的上下文信息,如线程ID、请求ID等,这对于排查分布式系统问题非常有用。 9. **安全性...

    log4j.ex.jar(包含源码)

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

    Log4j The Complete Manual.pdf

    ### Log4j完整手册知识点概览 #### 一、Log4j简介与版本说明 - **Log4j**是一款开放源代码的日志记录组件,它允许开发者以灵活的方式记录应用程序中的事件信息。此文档适用于**Log4j 1.2及后续版本**,这些版本在...

    log4j日志输出格式化和日志文件名格式化

    为了实现公司日志的标准,你可能需要根据业务需求调整这个模式字符串,比如增加线程ID、IP地址等信息。 接下来,我们讨论日志文件名的格式化。Log4j的FileAppender或RollingFileAppender可以控制日志文件的存储位置...

Global site tag (gtag.js) - Google Analytics