【发布时间】:2016-04-02 21:29:02
【问题描述】:
我想使用 log4j2 异步日志记录将线程 ID 作为我的日志消息的一部分。
对于 log4j2 2.4.1,这可以通过覆盖 logMessage 方法的自定义 AsyncLogger 来实现。
public class ThreadIdAsyncLogger extends AsyncLogger {
private static final long serialVersionUID = 1L;
private static final ThreadLocal<Boolean> THREAD_CONTEXT_SETUP = new ThreadLocal<Boolean>() {
@Override
protected Boolean initialValue() {
return false;
}
};
public ThreadIdAsyncLogger(final LoggerContext context, final String name, final MessageFactory messageFactory) {
super(context, name, messageFactory);
}
@Override
public void logMessage(final String fqcn,
final Level level,
final Marker marker,
final Message message,
final Throwable thrown) {
if (!THREAD_CONTEXT_SETUP.get()) {
// it is enough to set it once per thread
ThreadContext.put(Constants.ContextMapKeys.THREAD_ID, String.valueOf(Thread.currentThread().getId()));
THREAD_CONTEXT_SETUP.set(true);
}
super.logMessage(fqcn, level, marker, message, thrown);
}
}
我刚刚尝试更新到 2.5.0 版,现在我似乎无法再创建自己的 AsyncLogger,因为 AsyncLoggerDisruptor 是包私有的。
我知道我可以使用反射,但我想有更好的方法。
实现相同功能的最佳实践(设计和性能方面)是什么?
【问题讨论】:
标签: java asynchronous logging log4j log4j2