1. 简介

Log4j 是一个用 Java 编写的流行开源日志框架,被众多 Java 应用广泛使用。它具备线程安全、高性能的特点,并支持命名化的 Logger 层级结构。Log4j 遵循 Apache 开源软件许可证发布。

⚠️ 重要提示:Log4j 1.x 已于 2015 年 8 月 5 日停止维护。目前最新版本是 Log4j2。

本文将深入讲解 Log4j 核心组件,并通过 log4j.properties 文件演示配置方法。

2. Maven 依赖配置

在 pom.xml 中添加以下依赖:

org.apache.logging.log4j

log4j-api

1.2.17

最新版本可在 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 仓库

Copyright © 2088 1986世界杯_意大利世界杯 - zlrxcw.com All Rights Reserved.
友情链接