使用Log4j
约 1098 字大约 4 分钟
2025-07-15
9.1 Log4j 架构概览
Log4j 是一个组件化的日志系统,它允许将日志信息输出到不同的目的地,并提供了灵活的过滤和格式化功能。其核心组件包括:
- Appender:定义日志的输出目的地,例如控制台、文件、网络套接字或数据库。
- Filter:用于过滤需要输出的日志信息,可以根据日志级别或其他条件进行过滤。
- Layout:负责格式化日志信息的输出格式,例如添加日期、时间、线程信息等。
log.info("User signed in.");
│
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
├──▶│ Appender │───▶│ Filter │───▶│ Layout │───▶│ Console │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘
│
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
├──▶│ Appender │───▶│ Filter │───▶│ Layout │───▶│ File │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘
│
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
└──▶│ Appender │───▶│ Filter │───▶│ Layout │───▶│ Socket │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
9.2 Log4j 配置详解
Log4j 通过配置文件进行配置,通常使用 XML 格式。以下是一个 log4j2.xml
配置文件的示例,并对其进行了详细解释:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<!-- 定义日志格式 -->
<Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
<!-- 定义文件名变量 -->
<Property name="file.err.filename">log/err.log</Property>
<Property name="file.err.pattern">log/err.%i.log.gz</Property>
</Properties>
<!-- 定义Appender,即目的地 -->
<Appenders>
<!-- 定义输出到屏幕 -->
<Console name="console" target="SYSTEM_OUT">
<!-- 日志格式引用上面定义的log.pattern -->
<PatternLayout pattern="${log.pattern}" />
</Console>
<!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
<RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
<PatternLayout pattern="${log.pattern}" />
<Policies>
<!-- 根据文件大小自动切割日志 -->
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<!-- 保留最近10份 -->
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<!-- 对info级别的日志,输出到console -->
<AppenderRef ref="console" level="info" />
<!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
<AppenderRef ref="err" level="error" />
</Root>
</Loggers>
</Configuration>
代码解释:
<Configuration>
:根节点,包含整个 Log4j 的配置信息。<Properties>
:定义全局属性,例如日志格式 (log.pattern
) 和文件名 (file.err.filename
,file.err.pattern
)。log.pattern
定义了日志输出的格式,其中%d
表示日期,%t
表示线程名,%-5level
表示日志级别,%logger{36}
表示 logger 名称,%msg
表示日志消息。file.err.filename
定义了错误日志的文件名。file.err.pattern
定义了滚动日志的文件名模式,用于指定日志文件切割后的命名规则。
<Appenders>
:定义日志的输出目的地。<Console>
:将日志输出到控制台。target="SYSTEM_OUT"
表示输出到标准输出流。<RollingFile>
:将日志输出到文件,并根据策略进行滚动(切割)。fileName
:指定当前日志文件的名称。filePattern
:指定日志文件滚动时的命名规则。%i
会被替换为递增的数字,.gz
表示使用 gzip 压缩。<Policies>
:定义日志滚动策略。<SizeBasedTriggeringPolicy>
:基于文件大小触发滚动。size="1 MB"
表示当日志文件达到 1MB 时进行滚动。
<DefaultRolloverStrategy>
:定义滚动策略。max="10"
表示最多保留 10 个滚动日志文件。
<Loggers>
:定义 Logger 的配置。<Root>
:根 Logger,用于配置全局的日志级别和 Appender。level="info"
:设置根 Logger 的日志级别为 INFO,表示会输出 INFO、WARN、ERROR 和 FATAL 级别的日志。<AppenderRef>
:引用已定义的 Appender。ref="console"
:引用名为 "console" 的 Appender,用于将日志输出到控制台。ref="err"
:引用名为 "err" 的 Appender,用于将日志输出到文件。
总而言之,该配置文件的作用是:将 INFO 级别的日志输出到控制台,同时将 ERROR 级别的日志输出到文件,并且当日志文件达到 1MB 时进行滚动,最多保留 10 个滚动日志文件。通过灵活配置 Appender,可以满足各种日志输出需求。
9.3 Log4j 的使用步骤
- 下载 Log4j 2 的相关 jar 包。可以从 Apache Logging Services 下载。
- 将必要的 jar 包添加到 classpath 中。至少需要以下三个 jar 包:
log4j-api-2.x.jar
log4j-core-2.x.jar
log4j-jcl-2.x.jar
(如果使用 Commons Logging 作为日志接口)
- 放置
log4j2.xml
配置文件到 classpath 根目录下。 - 如果使用 Commons Logging,需要将
commons-logging-1.2.jar
也添加到 classpath 中。
完成以上步骤后,就可以像使用 Commons Logging 一样使用 Log4j 进行日志输出了。
9.4 最佳实践
- 始终使用 Commons Logging 接口来写入日志:这样可以在不修改代码的情况下切换不同的日志实现。
- 在开发阶段无需引入 Log4j:只有在需要将日志写入文件时,才需要将
log4j2.xml
配置文件和 Log4j 相关的 jar 包放入 classpath。