1. 简介
Log4j 是一个用 Java 编写的流行开源日志框架,被众多 Java 应用广泛使用。它具备线程安全、高性能的特点,并支持命名化的 Logger 层级结构。Log4j 遵循 Apache 开源软件许可证发布。
⚠️ 重要提示:Log4j 1.x 已于 2015 年 8 月 5 日停止维护。目前最新版本是 Log4j2。
本文将深入讲解 Log4j 核心组件,并通过 log4j.properties 文件演示配置方法。
2. Maven 依赖配置
在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>1.2.17</version>
</dependency>
最新版本可在 Maven 中央仓库 查询
3. Log4j API 架构
Log4j API 提供基于优先级的日志信息传递机制,支持将日志定向到多种目标(文件、控制台、数据库等)。核心特性包括:
- ✅ 支持日志事件过滤
- ✅ 分层架构设计
- ✅ 包含核心对象和支持对象两类组件
4. Log4j 核心组件
Log4j 由三大核心组件构成:Logger、Appender 和 Layout。三者协同工作实现定制化日志输出。
4.1. Logger
Logger 负责捕获日志信息,是 Log4j 架构的入口层。最佳实践是:
private static final Logger logger = Logger.getLogger(JavaClass.class.getName());
关键特性:
- 每个类创建独立实例
- 使用静态工厂方法初始化
- 支持六级日志方法(优先级递增):
graph LR TRACE --> DEBUG --> INFO --> WARN --> ERROR --> FATAL
4.2. Appender
Appender 定义日志输出目的地。支持多目标输出:
- 控制台
- 文件系统
- 远程 Socket 服务器
- 数据库
- JMS 消息队列
核心规则:遵循 Appender 可加性原则——日志会输出到当前 Logger 及其所有祖先 Appender。
4.3. Layout
Layout 控制日志输出格式。通过转换模式(Conversion Pattern)定制格式:
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
常用转换字符: | 字符 | 说明 | |------|------| | %d | 时间戳 | | %-5p | 日志级别(左对齐5字符) | | %c{1}| 类名(精简版) | | %L | 行号 | | %m | 日志消息 | | %n | 换行符 |
5. log4j.properties 文件
配置文件特点:
- 默认名称:
log4j.properties
- 自动加载位置:CLASSPATH
- 支持自定义路径(通过系统属性
log4j.configuration
指定)
文件内容结构:
# 根 Logger 配置
log4j.rootLogger=LEVEL, APPENDER_NAME
# Appender 定义
log4j.appender.APPENDER_NAME=AppenderClass
log4j.appender.APPENDER_NAME.layout=LayoutClass
6. 配置文件语法详解
标准配置模板:
# 根 Logger 配置
log4j.rootLogger = DEBUG, CONSOLE
# Appender 关联
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
# Layout 定义
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.conversionPattern=%m%n
配置要点:
- 先定义根 Logger 级别和 Appender 名称
- 为 Appender 名称指定实现类
- 配置 Layout 及转换模式
7. 实战示例
7.1. 测试程序
import org.apache.log4j.Logger;
public class Log4jExample {
private static Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) throws InterruptedException {
for(int i = 1; i <= 2000; i++) {
logger.info("This is the " + i + " time I say 'Hello World'.");
Thread.sleep(100);
}
}
}
程序特点:
- 循环输出 2000 条日志
- 每次间隔 100ms
- 总执行时间约 3.5 分钟
7.2. 控制台日志配置
# 根 Logger 配置
log4j.rootLogger=INFO, stdout
# 控制台 Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
输出示例:
2023-08-01 00:27:25 INFO Log4jExample:15 - This is the 1 time I say 'Hello World'.
...
2023-08-01 00:27:25 INFO Log4jExample:15 - This is the 2000 time I say 'Hello World'.
7.3. 多目标输出配置
# 根 Logger
log4j.rootLogger=INFO, file, stdout
# 文件 Appender(滚动文件)
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\Baeldung\\app.log
log4j.appender.file.MaxFileSize=5KB
log4j.appender.file.MaxBackupIndex=2
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# 控制台 Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
滚动文件机制:
MaxFileSize=5KB
:单文件最大 5KBMaxBackupIndex=2
:保留 2 个备份文件- 文件生成示例:
app.log (当前日志) app.log.1 (备份1) app.log.2 (备份2)
8. 总结
本文系统讲解了 Log4j 的三大核心组件:
- Logger:日志捕获器
- Appender:输出目标控制器
- Layout:格式化引擎
通过 log4j.properties 文件,我们实现了:
- ✅ 控制台日志输出
- ✅ 滚动文件日志管理
- ✅ 多目标日志同步输出
完整示例代码见 GitHub 仓库