在 Java 中使用 java.util.logging.Logger(JUL,即“Java 自带的 Logger”)时,“丢日志”是一个很常见的问题,通常不是真的“丢了”,而是被过滤、被覆盖、被异步吞掉或配置不对。下面按最常见原因 → 原理 → 解决办法系统说明。
Logger logger = Logger.getLogger("com.xxx");
logger.info("hello");
如果你没有配置,默认:
INFOINFO但一旦你写了:
logger.setLevel(Level.WARNING);
那 info() 就直接不输出。
✅ 解决:
logger.setLevel(Level.ALL);
JUL 的日志是否输出,是 两级判断:
Logger Level ✅
↓
Handler Level ✅
示例错误:
logger.setLevel(Level.ALL);
handler.setLevel(Level.WARNING); // INFO 被丢掉
✅ 解决:
handler.setLevel(Level.ALL);
JUL 是树形结构:
"" (root)
└── com
└── xxx
如果你只配了:
Logger.getLogger("com.xxx").setLevel(Level.ALL);
但 root handler 是 WARNING,仍然可能丢日志。
✅ 正确做法:
Logger root = Logger.getLogger("");
root.setLevel(Level.ALL);
for (Handler h : root.getHandlers()) {
h.setLevel(Level.ALL);
}
常见于:
现象:
✅ 解决:
FileHandler fh = new FileHandler("app.log", true);
fh.setLevel(Level.ALL);
logger.addHandler(fh);
如果你:
就可能出现:
程序结束 → 日志还没写 → 丢失
✅ 解决:
handler.flush();
handler.close();
或确保 JVM 不提前退出。
错误示例:
Logger logger = Logger.getLogger("x");
logger.setLevel(Level.ALL);
// 另一个类又来一次
Logger.getLogger("x").setLevel(Level.OFF);
JUL 的 Logger 是单例(按名字)。
✅ 建议:
logging.propertieslogging.propertieshandlers=java.util.logging.FileHandler
.level=ALL
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.pattern=app.log
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
启动:
java -Djava.util.logging.config.file=logging.properties Main
如果你实际用的是:
org.apache.log4jlogback那“丢日志”原因不同(异步队列、buffer、滚动策略等),可以告诉我你用的是哪一个。
Java Logger 丢日志,90% 是因为 Level 被过滤或 Handler 没配对。
如果你愿意,可以把:
贴出来,我可以帮你精准定位是哪一行配置在丢日志。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。