1. 简介
Log4j 2 是一个用 Java 编写的流行开源日志框架。它旨在解决 Log4j 的各种架构缺陷,具有线程安全、高性能等特点,相比前代有显著改进。该框架采用 Apache 软件许可证开源。
Log4j 2 是经典 Log4j 框架的升级版(原版已于 2015 年 8 月终止维护),但 Log4j 仍在许多 Java 企业应用中广泛使用。
本文将介绍 Log4j 2 的优势,以及如何通过 log4j2.properties
文件配置其核心组件。
2. Maven 依赖配置
首先在 pom.xml
中添加以下依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
最新版本可在 Maven 中央仓库 查找。
3. Log4j 2 Logger
与 Log4j 使用 Logger.getLogger()
不同,Log4j 2 通过 LogManager.getLogger()
获取 Logger 实例:
private static final Logger logger = LogManager.getLogger(Log4j2Example.class);
LogManager
从配置文件或配置类读取初始参数。Logger 关联 LoggerConfig
,后者再关联实际处理日志事件的 Appender
。
关键点:
- ✅ 传入相同类名调用
LogManager.getLogger()
总是返回同一个 Logger 实例 - ✅ Logger 和 LoggerConfig 都遵循命名层级(如
com.example
是com.example.service
的父级)
4. Log4j 2 配置方式
Log4j 2 支持多种配置格式:
- JSON
- XML
- YAML
- Properties
核心特性:
- 所有格式功能等价,可相互转换
- ⚠️ 支持自动配置(初始化时自动扫描配置文件)
- 配置优先级:Properties (8) > YAML > JSON > XML
若同时存在多种配置文件,优先使用 Properties 文件。
5. log4j2.properties 文件
Log4j 2 从 2.4 版本开始支持 Properties 配置。默认配置文件名为 log4j2.properties
,需位于 CLASSPATH 下。
自定义配置文件:
# 通过系统属性指定配置文件路径
-Dlog4j.configurationFile=/path/to/custom.properties
未找到配置文件时:
- 使用
DefaultConfiguration
- 仅输出 ERROR 级别日志到控制台
6. Properties 文件语法
与旧版 log4j.properties
不同,新版语法不再需要 log4j
前缀:
# 根日志配置
rootLogger = DEBUG, STDOUT
# 定义控制台输出器
appender.console.name = STDOUT
appender.console.type = Console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %msg%n
关键规则:
- ✅ 必须定义根日志记录器(root logger)
- ❌ 未定义时将使用默认配置(ERROR 级别 + ConsoleAppender)
7. 配置示例
7.1 示例程序
public class Log4j2ConsoleAndFile {
private static final Logger logger = LogManager.getLogger(Log4j2ConsoleAndFile.class);
public static void main(String[] args) {
logger.info("Hello World!");
logger.debug("Hello World!");
}
}
7.2 控制台日志配置
# 根日志配置
rootLogger=DEBUG, STDOUT
# 控制台输出器
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
模式解析:
| 转换符 | 说明 |
|--------|------|
| %-5level
| 左对齐的日志级别(5字符宽度) |
| %d{...}
| 时间戳 |
| %t
| 线程名 |
| %c{1}
| 简短类名 |
| %msg
| 日志消息 |
| %n
| 换行符 |
输出示例:
[INFO ] 2023-08-05 23:04:03.255 [main] Log4j2ConsoleAndFile - Hello World!
[DEBUG] 2023-08-05 23:04:03.255 [main] Log4j2ConsoleAndFile - Hello World!
7.3 多目标输出配置
# 根日志配置
rootLogger=INFO, STDOUT, LOGFILE
# 控制台输出器
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
# 文件输出器
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = baeldung/logs/log4j2.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.file.filter.threshold.type = ThresholdFilter
appender.file.filter.threshold.level = info
关键配置:
- ✅ 同时输出到控制台和文件
- ⚠️ 文件输出器使用
ThresholdFilter
过滤 INFO 及以上级别日志 - 📁 文件路径需指定完整位置
输出结果:
[INFO ] 2023-08-05 23:04:03.255 [main] Log4j2ConsoleAndFile - Hello World!
8. 总结
本文介绍了 Log4j 2 相比 Log4j 的优势,以及如何通过 log4j2.properties
文件进行配置。核心要点包括:
- ✅ 支持多种配置格式(Properties/XML/JSON/YAML)
- ✅ Properties 配置语法简洁高效
- ✅ 灵活的多目标日志输出方案
- ⚠️ 务必定义根日志记录器避免默认配置
完整示例代码可在 GitHub 获取。