在選擇項目日志框架時,發現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類
12345678910public
class
LogBackExEncoder
extends
PatternLayoutEncoder {
static
{
PatternLayout.defaultConverterMap.put(
"T"
, ThreadNumConverter.
class
.getName());
PatternLayout.defaultConverterMap.put(
"threadNum"
, ThreadNumConverter.
class
.getName());
}
@Override
public
void
doEncode(ILoggingEvent event)
throws
IOException {
super
.doEncode(event);
}
}
123456789public
class
ThreadNumConverter
extends
ClassicConverter {
/**
* 當需要顯示線程ID的時候,返回當前調用線程的ID
*/
@Override
public
String convert(ILoggingEvent event) {
return
String.valueOf(Thread.currentThread().getId());
}
}
在配置文件中調用自己的Encoder
123456<!-- 控制台輸出 -->
<
appender
name
=
"stdout"
class
=
"ch.qos.logback.core.ConsoleAppender"
>
<
encoder
charset
=
"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配置文件
附件列表