log4j2是Java生态中常用的日志框架,它的配置文件log4j2.xml可以灵活控制日志的输出位置、格式和级别,合理编写配置文件能让日志更好地服务于开发调试和问题排查。

log4j2.xml基础结构
一个完整的log4j2.xml配置文件主要包含<Configuration>根节点,根节点下通常有<Properties>、<Appenders>、<Loggers>三个核心子节点,分别用于定义全局变量、配置日志输出目的地、配置日志记录器。
下面是一个最基础的log4j2.xml配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<!-- 全局属性定义 -->
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
<Property name="LOG_HOME">./logs</Property>
</Properties>
<!-- 日志输出目的地配置 -->
<Appenders>
<!-- 控制台输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- 文件输出 -->
<RollingFile name="File" fileName="${LOG_HOME}/app.log"
filePattern="${LOG_HOME}/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<!-- 日志记录器配置 -->
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
log4j2日志级别说明
log4j2的日志级别从低到高依次为trace、debug、info、warn、error、fatal,级别越高日志越重要,设置某个级别后,只会输出该级别及更高级别的日志。
- trace:追踪级别,一般用于输出非常详细的调试信息,比如方法入参、每一步的执行结果,生产环境通常不会开启。
- debug:调试级别,用于输出调试相关的信息,开发环境常用,生产环境一般关闭。
- info:信息级别,用于输出程序正常运行的关键信息,比如服务启动成功、重要业务操作完成,生产环境通常会保留。
- warn:警告级别,用于输出潜在的问题,比如参数不合法但程序还能继续运行,需要关注但不影响核心功能。
- error:错误级别,用于输出程序运行中的错误,比如接口调用失败、数据校验不通过,会影响部分功能。
- fatal:严重错误级别,用于输出导致程序无法继续运行的致命错误,比如数据库连接失败、核心配置缺失。
日志级别设置方法
全局根日志级别设置
全局日志级别通过<Root>标签的level属性设置,上面的示例中<Root level="info">就表示全局日志级别为info,只会输出info及以上级别的日志。
如果要开启调试模式,只需要把level改为debug即可:
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
针对特定包或类设置日志级别
如果只想让某个包或者某个类的日志输出更详细,而其他部分保持默认级别,可以添加<Logger>子标签,指定包名或类名和对应的级别。
比如要让com.example.service包下的类输出debug级别的日志,其他部分还是info级别,配置如下:
<Loggers>
<Logger name="com.example.service" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
这里的additivity属性表示是否将日志向上传递给父日志记录器,设置为false表示只使用当前Logger的配置,不会重复输出到Root的Appender中。
代码中动态设置日志级别
除了在配置文件中静态设置,也可以在代码中动态修改日志级别,比如临时开启某个包的debug日志:
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.xml.XmlConfiguration;
import java.io.File;
import java.io.FileInputStream;
public class LogLevelUtil {
public static void setLoggerLevel(String loggerName, Level level) {
Configurator.setLevel(loggerName, level);
}
public static void main(String[] args) {
// 将com.example.service包的日志级别设置为debug
setLoggerLevel("com.example.service", Level.DEBUG);
}
}
常见配置注意事项
- 配置文件的文件名必须是log4j2.xml,并且放在项目的classpath路径下,log4j2才会自动加载。
- 如果同时存在log4j2.xml和log4j2.properties等配置文件,log4j2会优先加载log4j2.xml。
- 日志级别设置不要过低,生产环境开启debug或trace会导致日志量过大,影响程序性能,还可能导致磁盘空间不足。
- Appender的name属性不能重复,否则会导致配置加载失败。
注意:修改log4j2.xml配置文件后,如果是web项目一般重启服务才会生效,部分环境可以开启自动重载配置,在<Configuration>标签中添加monitorInterval="30"属性,表示每30秒检查一次配置文件是否有变化,有变化则自动重载。
log4j2log4j2_xml日志级别日志配置修改时间:2026-07-07 00:15:33