转载地址: 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/]