java标准日志(jul)需通过logger.getlogger(类全限定名)获取实例,优先用info记录关键流程,确保handler级别≥logger级别,并在日志消息中明确业务上下文。

Java 标准日志(JUL,java.util.logging)开箱即用,无需引入任何第三方依赖,适合快速记录运行状态。关键不是“能不能打”,而是“打在哪、打什么、怎么打清楚”。下面从实际编码出发,讲清核心要点。
获取 Logger 实例并规范命名
Logger 必须通过 Logger.getLogger() 获取,不能 new。名称推荐使用类全限定名,这样日志里自动带出类路径,便于定位:
- ✅ 推荐写法:
private static final Logger logger = Logger.getLogger(OrderService.class.getName()); - ❌ 避免硬编码字符串:
Logger.getLogger("OrderService")—— 类名改了就断联 - ❌ 不建议用包名:
Logger.getLogger("com.example.service")—— 多个类日志混在一起,排查困难
按语义选对日志级别
INFO 是记录运行状态最常用的级别,用于标记关键流程节点,比如服务启动、任务开始/结束、业务成功提交等:
logger.info("订单服务已启动,监听端口: 8080");logger.info("定时任务 [user-sync] 执行完成,同步用户数: 127");logger.info(String.format("用户 %s 登录成功,IP=%s", userId, ip));
WARNING 和 SEVERE 不用于常规状态,仅在出现可恢复异常或系统级故障时使用,例如配置缺失、远程调用超时、数据库连接中断等。
让日志输出真正可见
JUL 默认只把 INFO 及以上日志输出到控制台,但有时你发现 logger.info(...) 没反应——大概率是 Handler 没配好或级别被拦截:
- 默认情况下,根 Logger 的 Handler 只接受 INFO 级别及以上;若你调用了
logger.setLevel(Level.FINE),但没给 Handler 同步设级别,日志仍不会输出 - 确保 Handler 级别 ≥ Logger 级别,例如:
consoleHandler.setLevel(Level.INFO); logger.addHandler(consoleHandler); - 如需输出到文件,用
FileHandler并开启追加模式:new FileHandler("app.log", true),避免每次覆盖
格式统一、信息完整才便于追踪
默认日志格式含时间、类名、方法名和行号(取决于 Formatter),但业务上下文要自己拼入消息中:
- ✅ 带上下文:
logger.info("支付回调处理完成,订单ID=" + orderId + ", 状态=SUCCESS"); - ❌ 空泛模糊:
logger.info("处理完成");—— 完成什么?哪个订单? - 如需更结构化输出,可自定义
Formatter,比如继承SimpleFormatter,重写format()方法,加入 traceId、userId 等字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











