精通 Java 日志记录:基础组件与最佳实践
Java 日志记录基础
本教程通过示例学习 Java Logging 及其各组件。
Java 允许通过日志记录过程创建和捕获日志消息与文件。
Java 日志需要框架和 API。Java 在 java.util.logging 包内置了日志框架。
也可使用第三方框架如 Log4j、Logback 等进行日志记录。
Java 日志组件
下图展示 Java Logging API (java.util.logging) 的核心组件与控制流。

1. Logger
Logger 类提供日志记录方法。可实例化 Logger 对象并调用其方法记录日志。
示例:
Logger logger = Logger.getLogger("newLoggerName");
Logger 类的 getLogger() 方法用于查找或创建新 Logger。字符串参数定义日志记录器名称。
此处创建新 Logger 对象或返回同名的现有 Logger。
惯例使用 class.getName() 以当前类名定义 Logger。
Logger logger = Logger.getLogger(MyClass.class.getName());
注意: 传入名称为 null 时抛出 NullPointerException。
每个 Logger 有级别决定日志消息重要性。共有 7 个基本日志级别:
| 日志级别(按严重度降序) | 用途 |
|---|---|
| SEVERE | 严重失败 |
| WARNING | 警告消息,潜在问题 |
| INFO | 通用运行时信息 |
| CONFIG | 配置信息 |
| FINE | 通用开发者信息(跟踪消息) |
| FINER | 详细开发者信息(跟踪消息) |
| FINEST | 高度详细开发者信息(跟踪消息) |
| OFF | 关闭所有级别日志(不捕获任何内容) |
| ALL | 开启所有级别日志(捕获所有内容) |
除 OFF 和 ALL 两个特殊级别外,每个日志级别有整数值表示严重程度。
记录日志消息
默认记录前三个级别。设置其他级别:
logger.setLevel(Level.LogLevel); // 例 logger.setLevel(Level.FINE);
此例中仅记录 FINE 及以上级别,其他消息丢弃。
记录消息使用 log() 方法:
logger.log(Level.LogLevel, "log message"); // 例 logger.log(Level.INFO, "This is INFO log level message");
各级别有简写方法:
logger.info("This is INFO log level message"); logger.warning("This is WARNING log level message");
所有通过设置级别的日志请求转发给 LogRecord。
注意: 若日志记录器级别为 null,其级别从父级继承,以此类推向上。
2. 过滤器
过滤器(若存在)决定 LogRecord 是否应转发。顾名思义,按特定标准过滤日志消息。
LogRecord 仅在通过指定标准时,从日志记录器传给处理器,再从处理器传给外部系统。
// 设置过滤器 logger.setFilter(filter); // 获取过滤器 Filter filter = logger.getFilter();
3. 处理器(Appenders)
日志处理器或追加器接收 LogRecord 并导出到各种目标。
Java SE 提供 5 个内置处理器:
| 处理器 | 用途 |
|---|---|
StreamHandler | 写入 OutputStream |
ConsoleHandler | 写入控制台 |
FileHandler | 写入文件 |
SocketHandler | 写入远程 TCP 端口 |
MemoryHandler | 写入内存 |
处理器可将 LogRecord 传给过滤器,再次决定是否转发到外部系统。
添加新处理器:
logger.addHandler(handler); // 例 Handler handler = new ConsoleHandler(); logger.addHandler(handler);
移除处理器:
logger.removeHandler(handler); // 例 Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
日志记录器可有多个处理器。获取所有处理器:
Handler[] handlers = logger.getHandlers();
4. 格式化器
处理器可使用 Formatter 在导出外部系统前将 LogRecord 格式化为字符串。
Java SE 有两个内置 Formatter:
| 格式化器 | 用途 |
|---|---|
SimpleFormatter | 格式化 LogRecord 为字符串 |
XMLFormatter | 格式化 LogRecord 为 XML 形式 |
格式化处理器:
// 格式化为字符串 handler.setFormatter(new SimpleFormatter()); // 格式化为 XML handler.setFormatter(new XMLFormatter());
LogManager
LogManager 对象维护全局日志信息。它读取并维护日志配置和日志记录器实例。
日志管理器是单例,即仅实例化一个实例。
获取日志管理器实例:
LogManager manager = LogManager.getLogManager();
日志记录的优势
Java 日志记录的优势:
- 帮助监控程序执行流程
- 帮助捕获可能发生的错误
- 为问题诊断和调试提供支持
java
- Java日志最佳实践:三大核心原则构建可观测的可靠代码
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比