1. 简介
Log4j 是一个用 Java 编写的流行开源日志框架,被众多 Java 应用广泛使用。它具备线程安全、高性能的特点,并支持命名化的 Logger 层级结构。Log4j 遵循 Apache 开源软件许可证发布。
⚠️ 重要提示:Log4j 1.x 已于 2015 年 8 月 5 日停止维护。目前最新版本是 Log4j2。
本文将深入讲解 Log4j 核心组件,并通过 log4j.properties 文件演示配置方法。
2. Maven 依赖配置
在 pom.xml 中添加以下依赖:
最新版本可在 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:单文件最大 5KB
MaxBackupIndex=2:保留 2 个备份文件
文件生成示例:app.log (当前日志)
app.log.1 (备份1)
app.log.2 (备份2)
8. 总结
本文系统讲解了 Log4j 的三大核心组件:
Logger:日志捕获器
Appender:输出目标控制器
Layout:格式化引擎
通过 log4j.properties 文件,我们实现了:
✅ 控制台日志输出
✅ 滚动文件日志管理
✅ 多目标日志同步输出
完整示例代码见 GitHub 仓库
