LogbackPatternLayout
包含defaultConverterMap
将转换词(%n
,%msg
等%d
)映射到ch.qos.logback.core.pattern.Converter
. 这就是你所说的:
使用当前线程和类名等上下文信息增强日志消息
要在日志输出中包含 hashCode,您可以提供自己的实现ch.qos.logback.core.pattern.Converter
并将其与自定义转换词相关联,如下所示...
将此添加到logback.xml
<conversionRule conversionWord="hc" converterClass="some.package.HashCodeConverter" />
实现some.package.HashCodeConverter
如下:
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.CallerData;
public class HashCodeConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent le) {
StackTraceElement[] cda = le.getCallerData();
if (cda != null && cda.length > 0) {
return Integer.toString(System.identityHashCode(cda[0]));
} else {
return CallerData.NA;
}
}
}
更新您的编码器模式以使用转换字hc
:
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss}|[%thread]|%-5level|%logger{36}|%hc|%msg %n</pattern>
</encoder>
有了这些更改,您的自定义转换器将被启用,输出将如下所示......
2018-05-29 09:30:09|[main]|INFO |o.g.sandbox.logback.LogbackTest|1847637306|hello!
1847637306
发出日志事件的类的 hashCode在哪里。
笔记:
- 在上述实现中,我假设您感兴趣的 hashCode 是发出日志事件的类的 hashCode。如果这不是您感兴趣的,那么您将更改
HashCodeConverter
- 尽管上述获取发出日志事件的类的方法是 Logback 中的标准做法,但它确实需要生成堆栈跟踪,并且在大容量日志环境中为每个日志事件执行此操作可能会非常昂贵。如果是这样,那么在每条消息中包含 hashCode 可能是您唯一的选择。