Logback 中间出现 log.error("msg " + e) 这种写法时,堆栈信息确实会丢失。出问题的根子在于,这行代码把异常对象 e 给“字符串化”了——它调用了 e.toString(),结果只保留了异常类名和那一行 message,而完整的堆栈跟踪(stack trace)根本没机会传进 Logback 的日志方法。

Ja va中 Logback 打印异常日志 log.error(

确认是否真的丢了堆栈

不妨先检查一下实际输出的日志长什么样:

正确写法:把异常对象作为最后一个参数传入

Logback(以及 SLF4J)有个约定:当方法签名末尾是 Throwable 类型参数时,框架会自动提取并打印完整堆栈。这个结构必须保持,不能破坏。那么,该如何写才对?

检查日志配置是否禁用了堆栈输出

代码写对了,不代表就万事大吉了。Logback 配置也可能把堆栈给“过滤”掉。重点要看 中是否用了自定义 Pattern,尤其要注意几个细节:

排查工具与辅助手段

如果想快速验证当前的行为,可以这么做:

问题本身并不复杂,但确实容易忽略一个关键点:异常堆栈不是“自动附带”的,它依赖 SLF4J 的参数类型识别机制。只要保证 Throwable 是独立参数、配置中又启用了 %ex,就能稳定输出完整堆栈。

本文转载于:https://www.php.cn/faq/2822915.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。