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 由三大核心组件构成:LoggerAppenderLayout。三者协同工作实现定制化日志输出。

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  

配置要点

  1. 先定义根 Logger 级别和 Appender 名称
  2. 为 Appender 名称指定实现类
  3. 配置 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 的三大核心组件:

  1. Logger:日志捕获器
  2. Appender:输出目标控制器
  3. Layout:格式化引擎

通过 log4j.properties 文件,我们实现了:

  • ✅ 控制台日志输出
  • ✅ 滚动文件日志管理
  • ✅ 多目标日志同步输出

完整示例代码见 GitHub 仓库


原始标题:A Guide to Log4j and the log4j.properties File in Java | Baeldung