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
相关产品推荐
相关产品推荐

