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.examplecom.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 文件进行配置。核心要点包括:

  1. ✅ 支持多种配置格式(Properties/XML/JSON/YAML)
  2. ✅ Properties 配置语法简洁高效
  3. ✅ 灵活的多目标日志输出方案
  4. ⚠️ 务必定义根日志记录器避免默认配置

完整示例代码可在 GitHub 获取。


原始标题:Log4j 2 Configuration Using a Properties File | Baeldung