You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何用Log4j将INFO和ERROR日志分别输出到不同文件

问题分析与解决方案

一、关于application.properties日志配置的问题

你遇到的logging.file重复配置后仅最后一个生效的问题,是因为Spring Boot的配置文件中重复的键会被后续的配置覆盖。而且默认的日志框架(比如Logback)本身不支持将不同级别的日志分别输出到不同文件,所以这种方式无法实现按级别分文件的需求,必须使用专门的日志配置文件(如logback.xml、log4j2.xml)来实现。

二、为什么你的log4j2.xml配置未生效?

你的配置文件存在几个关键问题:

  1. 使用了Log4j 1.x的类路径:你的配置里用的是org.apache.log4j.*的类,但Log4j2的类路径是org.apache.logging.log4j.*,这会导致容器找不到对应的类,配置自然无法生效。
  2. 依赖未正确调整:Spring Boot默认使用Logback作为日志框架,如果你要切换到Log4j2,需要排除Logback的依赖,并引入Log4j2的相关依赖。
  3. 过滤器与Appender的配置不符合Log4j2规范:Log4j2的Appender和过滤器配置语法与Log4j 1.x差异较大,比如RollingFileAppender的配置、级别过滤器的用法都不一样。

解决步骤与正确配置示例

1. 调整Maven/Gradle依赖(以Maven为例)

在pom.xml中排除默认的Logback依赖,引入Log4j2:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <!-- 排除默认的Logback依赖 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 引入Log4j2依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2. 修正后的log4j2.xml配置

下面是符合Log4j2规范的配置,实现按级别分文件输出+滚动日志:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <!-- 定义变量,方便维护路径 -->
    <Properties>
        <Property name="LOG_PATH">D:/LogDemo</Property>
    </Properties>

    <!-- DEBUG级别日志Appender -->
    <Appenders>
        <RollingFile name="DEBUG-LOG-FILE" fileName="${LOG_PATH}/Debug.log" filePattern="${LOG_PATH}/Debug.%d{yyyy-MM-dd}.log.zip">
            <Filters>
                <!-- 只接受DEBUG级别,拒绝更高/更低级别 -->
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/>
            <Policies>
                <!-- 按天滚动日志 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <!-- 保留30天日志 -->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!-- ERROR级别日志Appender -->
        <RollingFile name="ERROR-LOG-FILE" fileName="${LOG_PATH}/Error.log" filePattern="${LOG_PATH}/Error.%d{yyyy-MM-dd}.log.zip">
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!-- INFO级别日志Appender -->
        <RollingFile name="INFO-LOG-FILE" fileName="${LOG_PATH}/Info.log" filePattern="${LOG_PATH}/Info.%d{yyyy-MM-dd}.log.zip">
            <Filters>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

        <!-- 控制台输出DEBUG级别日志 -->
        <Console name="STDOUT" target="SYSTEM_OUT">
            <Filters>
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="DEBUG-LOG-FILE"/>
            <AppenderRef ref="ERROR-LOG-FILE"/>
            <AppenderRef ref="INFO-LOG-FILE"/>
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>

3. 额外注意事项

  • 确保log4j2.xml文件放在项目的src/main/resources目录下,Spring Boot会自动加载这个位置的配置文件。
  • 如果是多模块项目,要确保依赖调整正确,避免多个日志框架冲突。
  • 可以通过logging.config属性指定自定义配置文件路径(比如logging.config=classpath:my-log4j2.xml),但默认位置下不需要额外配置。

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:39