在 Java 中,使用 Logger(如 java.util.logging.Logger 或常用日志框架如 Log4j / SLF4J) 打印异常时,关键是不要把异常当成普通字符串拼接到消息里,而是把异常对象作为参数传给日志方法,这样才能打印完整的堆栈信息。
下面分几种常见情况说明。
import java.util.logging.Logger;
private static final Logger logger = Logger.getLogger(MyClass.class.getName());
try {
// 可能抛异常的代码
} catch (Exception e) {
logger.log(LoggerLevel.SEVERE, "发生错误", e);
}
输出示例:
严重: 发生错误
java.lang.NullPointerException
at com.example.MyClass.test(MyClass.java:20)
...
logger.severe("发生错误: " + e.getMessage());
这样 只会打印异常信息,不会打印堆栈
import org.apache.log4j.Logger;
private static final Logger logger = Logger.getLogger(MyClass.class);
try {
...
} catch (Exception e) {
logger.error("发生错误", e);
}
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(MyClass.class);
try {
...
} catch (Exception e) {
logger.error("发生错误", e);
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
try {
...
} catch (Exception e) {
logger.error("发生错误: {}", "参数说明", e);
}
⚠️ 注意:
{} 只能用于 消息参数{}logger.error("用户 {} 操作失败", userId, e);
等价于:
logger.error("用户 " + userId + " 操作失败", e);
| 写法 | 是否打印堆栈 | 说明 |
|---|---|---|
logger.error(e.getMessage()) |
❌ | 只打印信息 |
logger.error("error: " + e) |
❌ | 只调用 toString |
logger.error("error", e) |
✅ | ✅ 正确 |
logger.error("error {}", e) |
❌ | 错误用法 |
打印异常时,一定把
Throwable作为日志方法的最后一个参数传入,而不是拼接到字符串里。
如果你用的是某个具体日志框架(如 Logback、Log4j2),可以告诉我,我可以给你更具体的配置示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。