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

Spring Boot集成Log4j2无法写入INFO级别日志问题咨询

Log4j2 INFO级别日志不输出排查结果与修复方案

核心错误点

你的配置和代码存在5处直接导致日志不输出的问题:

  • 属性拼写错误:所有ThresholdFilter配置中的onMAtch为错误拼写,正确属性名是onMatch(首字母o小写,M大写),Log4j2对配置属性大小写敏感,拼写错误时规则直接走默认值,过滤逻辑完全失效
  • 日志器获取逻辑错误:LogManager.getLogger()方法入参是Logger名称,不是Appender的name属性,你当前传入"matchFile""confirmFile"拿到的是未绑定任何输出规则、默认级别为ERROR的匿名Logger,根本不会走到你配置的两个RollingFile输出链路
  • 配置结构缺失:整个log4j2.xml缺少<Loggers>核心配置块,仅定义了输出组件(Appender)但没有完成Logger和Appender的绑定,也没有配置对应Logger的输出级别,默认Root Logger级别为ERROR,INFO级别日志会被直接拦截
  • 组件配置缺失:RollingFile是滚动输出组件,你没有配置滚动触发策略,就算其他配置正确也会在启动时抛出初始化错误
  • 过滤逻辑冗余:你堆叠了6个ThresholdFilter做级别拦截,逻辑顺序存在冲突,就算拼写正确,INFO级日志走到WARN级别过滤器时也会被deny拦截

修复步骤

1. 重写log4j2.xml配置

修正拼写、补全配置块、简化过滤规则、绑定日志器与输出组件:

<Configuration status="WARN">
    <Properties>
        <!-- 定义日志存储路径,替换为你实际的路径即可 -->
        <Property name="log-path">./logs</Property>
    </Properties>
    <Appenders>
        <!-- INFO级别日志输出文件 -->
        <RollingFile name="matchFile"
            fileName="${log-path}/match.log"
            filePattern="${log-path}/match-%d{yyyy-MM-dd}.log"
            immediateFlush="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Filters>
                <!-- 先拦截WARN及以上级别日志 -->
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!-- 匹配INFO级别日志放行,低于INFO的直接拦截 -->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
        <!-- WARN级别日志输出文件 -->
        <RollingFile name="confirmFile"
            fileName="${log-path}/confirm.log"
            filePattern="${log-path}/confirm-%d{yyyy-MM-dd}.log"
            immediateFlush="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Filters>
                <!-- 先拦截ERROR及以上级别日志 -->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!-- 匹配WARN级别日志放行,低于WARN的直接拦截 -->
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
        <!-- 控制台输出,按需保留 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <!-- 绑定INFO日志输出器,additivity设为false避免日志重复向上传递到Root -->
        <Logger name="matchLogger" level="info" additivity="false">
            <AppenderRef ref="matchFile"/>
        </Logger>
        <!-- 绑定WARN日志输出器 -->
        <Logger name="confirmLogger" level="warn" additivity="false">
            <AppenderRef ref="confirmFile"/>
        </Logger>
        <!-- 根日志器 -->
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

2. 修正业务代码的Logger获取逻辑

入参替换为配置中定义的Logger名称,不要传Appender名称:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class UserService{
    // 和<Logger>标签的name属性保持一致
    Logger matchLogger = LogManager.getLogger("matchLogger");
    Logger confirmLogger = LogManager.getLogger("confirmLogger");
    
    public void log(){
        matchLogger.info("print info"); // 写入match.log
        confirmLogger.warn("print warn"); // 写入confirm.log
    }
}

3. 排除Spring Boot默认日志依赖冲突

Spring Boot默认集成Logback日志,不排除的话会出现Log4j2配置不加载、级别不生效的问题,在pom.xml中修正依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <!-- 排除默认日志starter -->
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 引入Log4j2 starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>

验证结果

修改完成后重启服务调用对应方法:

  • match.log仅输出INFO级别日志
  • confirm.log仅输出WARN级别日志
  • 无日志混打、低级别日志丢失问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:03:28