Log4j迁移至Log4j2时如何实现getThrowableStrRep的等效功能
Log4j2 迁移:获取等效于Log4j 1.x getThrowableStrRep()的异常堆栈数组
Log4j2的LogEvent接口没有直接提供同名方法,可按照以下方式拿到完全等效的字符串数组结果:
- 先判断事件是否绑定了异常实例:调用
event.getThrown(),如果返回值为null,说明当前日志事件没有关联异常,直接返回空字符串数组即可,和Log4j 1.x的空场景逻辑一致。 - 存在异常时,不要手写JDK原生的
PrintWriter逻辑做堆栈转换,否则会丢失Log4j2内置的循环引用检测、嵌套cause处理、异常抑制信息兼容逻辑,直接用Log4j2 core包自带的ThrowableProxy类做格式化,输出的行结构和旧版API返回值完全对齐。
可直接复用的实现代码如下:
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.impl.ThrowableProxy; public void format(LogEvent event, StringBuilder outputMessage) { String[] eventStackTrace; Throwable thrown = event.getThrown(); if (thrown == null) { eventStackTrace = new String[0]; } else { ThrowableProxy proxy = new ThrowableProxy(thrown); // 按系统换行符拆分后得到的数组,和旧版getThrowableStrRep()返回内容完全等效 eventStackTrace = proxy.getExtendedStackTraceAsString() .split(System.lineSeparator(), -1); } // 这里写后续业务处理逻辑 }
可选适配说明
- 如果你不需要Log4j2默认附带的类加载信息、Jar包版本等扩展堆栈内容,想要和纯JDK
printStackTrace()输出的纯栈帧内容完全一致,可以把格式化那行替换为proxy.getCauseStackTraceAsString("").split(System.lineSeparator(), -1)。 - 如果你是在自定义Log4j2 Layout组件里做迁移,且已经在Layout里配置了
ThrowableFormat规则(比如指定栈帧深度、过滤包路径),直接用配置好的ThrowableFormat实例格式化即可,不需要手动构造ThrowableProxy。
内容的提问来源于stack exchange,提问作者bateda
相关产品推荐
相关产品推荐

