【Log4j】配置失效导致spring等框架一直打印DEBUG级别的日志

在SpringMVC+Hibernate+Log4j+SLF4J的应用环境中,日志级别设置为INFO,但DEBUG日志仍不断输出,造成日志文件快速增长。问题源于应用依赖的jar隐式依赖了logback,导致Log4j配置失效。解决办法是在Maven依赖中排除logback-classic和logback-core,保留log4j相关jar包,从而恢复Log4j的正确日志级别控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在应用中使用了SpringMVC+hibernate+Log4j+SLF4J。Log4j的日志级别调到INFO。但是在web容器(Tomcat)在启动和运行的时候spring,Hibernate等框架中DEBUG级别的日志不断狂刷,导致日志文件剧增,磁盘没几天就爆了。

针对这个问题在网上找了好多方法,都是没有效果或者治标不治本的。一直以为自己的Log4j配置文件写的有问题。后来在自己新搭建的project中发现Log4j的配置是正确的。只打印出INFO及以上级别的日志信息。后来才知道,是因为自己的应用依赖的jar隐式依赖了logback日志框架。

 

Log4j和logback是有冲突的,这样会导致Log4j的日志级别降低到DEBUG级别。知道了原因,就在maven依赖中把logback的隐式依赖给去掉。然后启动tomcat,发现日志可以正常打印。去除依赖的方法:

 

<dependency>
<groupId>com.hoteam.df</groupId>
<artifactId>util-tools</artifactId>
<version>3.1.8</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exc

<think>嗯,用户遇到的问题是关于SpringBoot项目中log4j.xml配置的问题,主要是error级别日志无法写入文件,而info级别日志完全没有输出,但是控制台输出正常。这是一个典型的日志配置问题。首先,我需要回忆一下SpringBoot日志框架整合逻辑。用户使用的是log4j而不是默认的logback,这需要排除默认日志依赖并引入log4j2的starter。我注意到用户提供的引用信息其实是关于logback和log4j2的内容,虽然用户说的是log4j.xml,但SpringBoot官方支持的是log4j2而不是log4j1。考虑在后续回复中提醒用户注意这个关键区别。关于错误现象,"error级别日志控制台正常但文件无记录"可能的原因有:文件追加器(Appender)的阈值设置过高;文件路径权限问题;或者Appender未正确关联Logger。而"info级别完全无输出"说明可能是全局日志级别设置过高或者特定Logger的定义覆盖了根Logger。用户引用中提到的场景2特别有参考价值,它说明当某个Logger设置了较高级别(additivity=true)时,会抑制上级Logger的输出。这可能正是用户info日志消失的原因。如果用户误将某个Logger级别设为ERROR,又开启了additivity,那么INFO日志自然被过滤。针对文件写入问题,需要注意三点:文件路径的写入权限、磁盘空间是否充足、Appender的immediateFlush配置。考虑在回复中建议用户加入文件锁检测代码,这在文件占用时特别有用。我准备建议用户分三步排查:首先是依赖检查,确保完全切换为log4j2;然后是配置文件验证,重点是Appender的文件路径配置和Logger继承层级;最后是运行时测试,加入jps命令验证实际生效的配置文件。在解决方案中会提醒一个容易忽略的点:当log4j2.xml放在src/main/resources下时,有些IDE可能会错误缓存配置文件,建议用户clean后再重启。另外考虑添加一个debug技巧:临时加入Log4j的内部状态日志,这能清晰展示配置文件加载过程和组件继承关系。</think> 针对Spring Boot项目中log4j.xml配置后error日志不写入文件(控制台正常)、info日志完全无输出的问题,结合日志框架原理和引用内容分析,主要原因和解决方案如下: --- ### 一、根本原因分析 1. **依赖冲突(首要检查)** Spring Boot默认使用Logback,若未正确排除默认日志框架并引入Log4j2依赖会导致配置失效: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <!-- 关键依赖 --> </dependency> ``` 2. **日志级别被覆盖** 如引用[2]所示,若存在特定包路径的Logger设置更高日志级别(如`ERROR`)且`additivity="true"`,会覆盖根Logger的INFO级别: ```xml <!-- 错误示例:此设置会抑制com.example包下的INFO日志 --> <Logger name="com.example" level="ERROR" additivity="true"/> ``` 3. **Appender配置错误** - 文件路径权限不足(Linux系统常见) - Appender未关联到Root Logger - Appender过滤器意外拦截(如`ThresholdFilter`设置过严) 4. **配置文件未被加载** - 文件未命名为`log4j2.xml`(而非log4j.xml) - 文件未放在`src/main/resources`目录 - 存在多个配置文件冲突 --- ### 二、解决方案 #### 步骤1:确认依赖正确性(强制检查) 确保pom.xml包含: ```xml <dependencies> <!-- 排除默认日志 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <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> </dependencies> ``` #### 步骤2:检查log4j2.xml关键配置 ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 控制台Appender --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 文件Appender --> <File name="FileAppender" fileName="logs/app.log" immediateFlush="true"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %c{1} - %msg%n"/> <!-- 保证error日志写入 --> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </File> </Appenders> <Loggers> <!-- 关键:Root Logger需包含文件和控制台 --> <Root level="INFO"> <!-- 全局INFO级别 --> <AppenderRef ref="Console"/> <AppenderRef ref="FileAppender"/> </Root> <!-- 示例:特定包路径日志设置(不可覆盖Root设置) --> <Logger name="com.example.service" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger> </Loggers> </Configuration> ``` #### 步骤3:修复配置要点 1. **文件写入权限问题** 确认`fileName`路径有写入权限(如`logs/`目录存在) ➔ 尝试改为绝对路径测试:`fileName="/tmp/app.log"` 2. **解决INFO日志丢失** - 检查所有`<Logger>`标签的`level`属性是否未设置高于`INFO` - 将可疑Logger的`additivity`设为`false`防止覆盖: ```xml <Logger name="com.problem.package" level="INFO" additivity="false"/> ``` 3. **日志级别继承验证** 在启动类添加测试代码: ```java @SpringBootApplication public class Application { private static final Logger logger = LogManager.getLogger(Application.class); public static void main(String[] args) { logger.error("ERROR测试"); // 应写入文件和控制台 logger.info("INFO测试"); // 应出现在控制台 SpringApplication.run(Application.class, args); } } ``` --- ### 三、调试技巧 1. **查看加载的配置文件** 启动时添加参数: `-Dlogging.config=classpath:log4j2.xml` `-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE` 2. **检查内部状态(关键)** 在log4j2.xml中添加: ```xml <Configuration status="TRACE"> <!-- 显示详细加载过程 --> ``` 3. **检测文件锁冲突** 在Java代码中手动检测文件是否被占用: ```java File logFile = new File("logs/app.log"); if(logFile.exists() && !logFile.renameTo(logFile)) { System.err.println("日志文件被锁定!"); } ``` --- ### 四、典型错误配置示例 ```xml <!-- 错误1:Appender未绑定到Root Logger --> <Root level="INFO"> <AppenderRef ref="Console"/> <!-- 缺少FileAppender --> </Root> <!-- 错误2:ThresholdFilter屏蔽INFO日志 --> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 错误3:Logger继承覆盖 --> <Logger name="com" level="ERROR" additivity="true"/> <!-- 导致所有com包下INFO被过滤 --> ``` > 📌 **重要提示**:若使用Spring Profile环境分隔配置,需确认激活的配置文件包含日志配置[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值