在选择项目日志框架时,发现log4j的作者开发了新的日志框架,据说性能提高不少,那就选它了,不过,除了配置上有点不习惯外,最重要的一点 ,打印线程号这个功能依然没有(打印线程名这个东西是在是个鸡肋)。在log4j的时代,改写PatternLayout 就可以实现打印线程号,参考另外一篇文章日志配置log4j 打印线程号 。但是最新版的logback貌似不支持改写PatternLayout, 纠结,搁置一段时间后,是在受不了,继续研究,翻阅N篇文档,虽然没有找到具体方法,但是受到了一些启发,最终找到方法了,在此与大家分享。
在pom.xml中引入依赖(如果你的项目不是Maven的,祝福你)
12345678910111213141516<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.13</version></dependency><!-- 代码直接调用log4j会被桥接到slf4j --><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>${slf4j.version}</version></dependency>新建Encoder类和Converter类
12345678910publicclassLogBackExEncoderextendsPatternLayoutEncoder {static{PatternLayout.defaultConverterMap.put("T", ThreadNumConverter.class.getName());PatternLayout.defaultConverterMap.put("threadNum", ThreadNumConverter.class.getName());}@OverridepublicvoiddoEncode(ILoggingEvent event)throwsIOException {super.doEncode(event);}}123456789publicclassThreadNumConverterextendsClassicConverter {/*** 当需要显示线程ID的时候,返回当前调用线程的ID*/@OverridepublicString convert(ILoggingEvent event) {returnString.valueOf(Thread.currentThread().getId());}}在配置文件中调用自己的Encoder
123456<!-- 控制台输出 --><appendername="stdout"class="ch.qos.logback.core.ConsoleAppender"><encodercharset="UTF-8"class="ch.qos.logback.core.encoder.LogBackExEncoder"><pattern>[APP_LOG] %date [%T] %-5level (%logger{80}.%method:%line - %msg%n</pattern></encoder></appender>其中[%T] 就是用于打印线程号的
日志效果
附上我的logback配置文件