首页 > 编程知识 正文

根据线程id获取线程(log4j打印线程号)

时间:2023-05-05 06:10:44 阅读:73985 作者:4279

转载地址: https://www.cn blogs.com/fanblogs/p/13501978.html

目的:

区分每个请求用户,更好地跟踪和分析问题(在用户登录后添加userId会更好) )。

进行多线程编程时,调试信息中经常会出现线程处理流程,当前线程信息必须反映在日志中。 由于Java的线程名称采用了默认的“Thread-1”等字符串,因此定位不方便。

分析:

在JDK1.5中,getId ()方法开始添加到Thread类中。 这意味着每个线程都将替换唯一的数字。

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

解决:

缺省情况下,Log4j在使用占位符%t显示名称时也提供线程名称的现实。

如果需要显示线程ID,则必须扩展log4j。

扩展Log4j的图案解析器

代码:

复制代码

package org.apache.log4j;

importorg.Apache.log4j.helpers.formatting info;

importorg.Apache.log4j.helpers.pattern converter;

importorg.Apache.log4j.helpers.pattern parser;

importorg.Apache.log4j.SPI.logging event;

publicclassexpatternparserextendspatternparser {

publicexpatternparser (字符串参数) super (参数) pattern; }/* * *重写初始化转换器以处理特定占位符。 t是线程ID占位符*/@ overrideprotectedvoidfinalizeconverter (charc ) if ) c=='t ' ) )。 } else { super.finalize converter (c; } privatestaticclassexpatternconverterextendspatternconverter { publicexpatternconverter (formattinginfofi ) super ) fi 当前调用线程的id */@ overrideprotectedstringconvert (loggingeventevent ) returnstring.valueof ) thread.cuent }} }

复制代码

扩展PatternLayout类并使用扩展的ExPatternParser类

代码:

复制代码

package org.apache.log4j;

importorg.Apache.log4j.pattern layout;

importorg.Apache.log4j.helpers.pattern parser;

publicclassexpatternlayoutextendspatternlayout {

publicexpatternlayout (字符串参数) super ) pattern; }公共扩展layout () { super ); }/* * *重写createpatternparser方法,将patternparser的子类*/@ overrideprotectedpatternparsercreatepatternparser { string pparser }

修改Log4j的配置文件,并将输出样式修改为扩展类ExPatternLayout

#设置输出样式

log4j.appender.appender1. layout=org.Apache.log4j.expatternlayout

这样扩展就完成了。 编译上述内容,并将其与log4j.jar一起使用,以配置和修改log4j.properties类

log4j.appender.stdout.layout=org.Apache.log4j.pattern layout

中选择所需的墙类型

log4j.appender.stdout.layout=ex.log4j.expatternlayout

输出格式为%t(log4j定义%t表示线程名称,%t未定义,因此此处使用%t表示线程ID ) )、

log4j.appender.stdout.layout.conversion pattern=% d { yyyy-mm-ddhh : mm 3360 ss } % t % c % 5p-% m % n

在这里,我们按照常规习惯使用log4j。 重新输出的日志包含线程ID,例如:

2009-03-2910336043360581 test.log.log4j test info-ok

时间之后的’1’表示线程id,并且在多线程环境(例如web环境)中,这样,通过一个web请求打印的记录信息可以容易地区别,而不会与通过其他web请求打印的记录信息相混淆。 也就是说,即使日志可读性提高,也很少输出无用的信息。

例:

log4j.appender.console.layout.conversion pattern=[ % d { hh : mm : ss.SSS } ] [ %-3p ] % x % c {1} 3360 %

[ 1133600:36.656 ] [ info ] [ t=u0lg2H5 hdgqmpvas,u=9709677 ] commonwebfilter 3360 completed request [/omm/http/]

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。