在 Java 中使用 Logger(通常指 java.util.logging.Logger 或如 Log4j / Logback)“定位错”,一般可以从下面几个层面来做:
通常有几种情况:
下面分别说明。
import java.util.logging.Logger;
public class Demo {
private static final Logger logger = Logger.getLogger(Demo.class.getName());
public static void main(String[] args) {
try {
int i = 1 / 0;
} catch (Exception e) {
logger.severe("发生错误:" + e.getMessage());
e.printStackTrace(); // 控制台能看到完整堆栈
}
}
}
⚠️ 问题:Logger 默认 不会打印异常堆栈
logger.log(java.util.logging.Level.SEVERE, "发生错误", e);
logger.log(Level.SEVERE, "业务处理失败", e);
log.error("业务处理失败", e);
❌ 错误写法(丢失堆栈):
log.error("错误:" + e.getMessage());
异常堆栈会显示:
com.xxx.Demo.main(Demo.java:12)
➡ 直接定位到第 12 行
logger.severe(
Demo.class.getName() + "#main 发生错误"
);
或:
new Throwable().getStackTrace()[1].getMethodName();
SEVERE > WARNING > INFO > CONFIG > FINE
如果 Handler 级别是 INFO,SEVERE 才会显示
logger.setLevel(Level.ALL);
<logger name="com.xxx" level="DEBUG"/>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
输出示例:
2026-01-15 10:00:00 [main] ERROR com.xxx.Demo - 业务失败
❌ 只打印 e.getMessage()
❌ 使用 System.out.println
❌ 日志级别太高
❌ 异常被吞掉(catch 后不处理)
❌ 多线程看不到线程名
✅ 永远 log.error("描述", e)
✅ 日志包含:谁、在哪、做了什么、为什么错
✅ 生产环境用 Logback / Log4j2
✅ 异常不要吞
如果你愿意,可以告诉我:
我可以给你针对性配置和示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。