如何用Log4j2(JSON格式)记录所有‘Caused by’异常?
解决Log4j2完整记录异常链的问题
你的问题出在配置里直接使用exceptionRootCause解析器,它会直接跳转到最底层的根异常,跳过了中间的异常节点。要完整记录整个异常链,需要利用exception解析器的递归特性,逐层遍历每个异常的cause。
修改后的异常配置部分
替换你当前配置中的exception节点为以下内容:
"exception": { "class_name": { "$resolver": "exception", "field": "className" }, "message": { "$resolver": "exception", "field": "message" }, "stack_trace": { "$resolver": "exception", "field": "stackTrace", "stackTrace": { "elementTemplate": { "class_name": { "$resolver": "stackTraceElement", "field": "className" }, "method": { "$resolver": "stackTraceElement", "field": "methodName" }, "file": { "$resolver": "stackTraceElement", "field": "fileName" }, "line": { "$resolver": "stackTraceElement", "field": "lineNumber" } } } }, "cause": { "$resolver": "exception", "field": "cause", "template": { "class_name": { "$resolver": "exception", "field": "className" }, "message": { "$resolver": "exception", "field": "message" }, "stack_trace": { "$resolver": "exception", "field": "stackTrace", "stackTrace": { "elementTemplate": { "class_name": { "$resolver": "stackTraceElement", "field": "className" }, "method": { "$resolver": "stackTraceElement", "field": "methodName" }, "file": { "$resolver": "stackTraceElement", "field": "fileName" }, "line": { "$resolver": "stackTraceElement", "field": "lineNumber" } } } }, "cause": { "$resolver": "exception", "field": "cause", "template": "$ref:$.exception.cause" } } } }
配置说明
- 顶层异常直接用
exception解析器获取自身的类名、消息和堆栈信息 cause字段不再直接跳转到根异常,而是通过exception解析器指定field为cause,并复用异常结构模板- 最内层的
cause使用$ref递归引用自身模板,实现自动遍历整个异常链,直到没有下一层cause为止
这样配置后,日志就能完整输出c → b → a的整个异常链,和printStackTrace()的输出结构一致。
内容的提问来源于stack exchange,提问作者user6412004
相关产品推荐
相关产品推荐

