jul怎么用:我实测后的顺手写法
jul怎么用,其实不用一上来就研究一堆配置文件。我这次拿一个小型 Java 服务实测了一遍,从创建 Logger、输出级别、控制台格式到文件日志,发现它适合轻量项目,也有几个默认行为很容易让人误会。
我的结论:JUL能用,但别把它想复杂
JUL 指的是 Java 自带的 java.util.logging,不用额外引包,JDK 里直接有。我实测下来,它最舒服的场景是:小工具、内部脚本、教学 Demo、轻量服务。如果你只是想把运行过程、异常信息、关键参数打出来,JUL 完全够用。
我平时写 Spring 项目会更多用 SLF4J + Logback,但写命令行工具时,JUL 的“零依赖”很香。一个 Logger.getLogger() 就能开干,不用纠结 pom、版本冲突、绑定实现这些事。
最小可用写法:三行就能跑
最基础的 jul怎么用?我一般这么起手:private static final Logger log = Logger.getLogger(App.class.getName()); 然后 log.info("start"); log.warning("param missing"); log.log(Level.SEVERE, "failed", e);
这里有个小细节:Logger 名称建议用类名,也就是 App.class.getName()。这样后面按包名调日志级别时比较顺,比如 com.demo.service 可以统一调到 FINE,而 com.demo.dao 继续保持 INFO。别随手写成 "mylog",后面排查会有点乱。
级别怎么选:别把 warning 当万能筐
JUL 常用级别从高到低是 SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST。我的经验是:SEVERE 放真正影响流程的错误;WARNING 放能继续跑但需要关注的问题;INFO 记录关键节点;FINE 以下留给调试细节。
比如用户传了空参数但程序用了默认值,我会打 WARNING;如果只是成功加载了 12 条配置,INFO 就够了。最容易翻车的是把所有东西都 warning,跑一周后日志里全是“狼来了”,真正异常反而没人看。
控制台输出:默认格式不太友好
JUL 默认走 ConsoleHandler,格式是 SimpleFormatter。它能看,但不太清爽,尤其是时间、类名、方法名混在一起,新手第一眼经常觉得“这玩意怎么这么丑”。
我实测更建议显式设置级别:Logger root = Logger.getLogger(""); root.setLevel(Level.INFO); for (Handler h : root.getHandlers()) h.setLevel(Level.INFO); 这一步很关键,因为 JUL 是 Logger 和 Handler 两层都要放行。你只改 Logger,Handler 不放,FINE 还是出不来。
文件日志:能落盘,但轮转要提前想
想写文件可以用 FileHandler:new FileHandler("app-%g.log", 1024 * 1024, 5, true)。这里 1024 * 1024 是单文件 1MB,5 表示最多保留 5 个轮转文件,true 表示追加写入。
我踩到的小坑是:FileHandler 默认输出 XMLFormatter,打开日志像看配置文件。实际项目里我会改成 new SimpleFormatter(),至少人眼能读。如果是线上服务,建议别只靠 JUL 手搓日志体系,日志收集、压缩、清理这些还是专业框架更省心。
常见问题
jul怎么用才会打印异常堆栈?
用 log.log(Level.SEVERE, "message", exception),不要只写 log.severe(e.getMessage()),后者通常只输出一句话,堆栈信息没了。
JUL为什么设置了FINE还是不显示?
通常是 Handler 级别没放开。JUL 要同时设置 Logger.setLevel(Level.FINE) 和 ConsoleHandler/FileHandler.setLevel(Level.FINE)。
JUL适合正式项目吗?
轻量项目可以,复杂服务更建议 SLF4J + Logback 或 Log4j2。JUL 胜在零依赖,输在生态、格式化能力和配置体验。