Spring Boot中log4j2.properties配置问题:无法记录INFO级日志
解决Log4j2无法记录INFO/DEBUG等日志到文件的问题
嗨,我来帮你一步步排查并解决这个日志配置问题!你的核心问题在于Log4j2的Logger配置存在覆盖、Root Logger未启用,以及和Spring Boot配置冲突这几个关键点,下面详细说:
核心问题拆解
- 重复定义Logger导致配置失效:你在
log4j2.properties里两次设置了logger.rolling.name,第二次的org.hibernate.SQL直接覆盖了第一次的业务包配置,导致你的业务代码(比如控制器)的日志完全没被关联到文件Appender。 - Root Logger未正确配置:Root Logger是所有未被特定Logger匹配的日志的默认处理入口,你注释掉了相关配置,导致控制器的测试日志(不属于Hibernate包)没有被任何Appender处理。
- Spring Boot配置与Log4j2冲突:你在
application.properties里设置的logging.level.*=INFO会干扰Log4j2的原生配置,应该优先使用Log4j2自身的配置来控制日志级别。
修改后的完整配置方案
1. 简化application.properties
只保留指定Log4j2配置文件的条目,去掉冗余的日志配置:
logging.config=classpath:log4j2.properties
2. 修正log4j2.properties配置
我帮你重新梳理了Logger和Appender的关联,确保所有级别的日志都能正确写入文件和控制台:
# Log4j2自身的日志级别(设为error避免自身日志干扰业务日志) status = error name = PropertiesConfig # 定义日志文件路径变量,方便统一修改 property.filename = logs/test.log # --- 控制台Appender配置 --- appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # --- 滚动文件Appender配置 --- appender.rolling.type = RollingFile appender.rolling.name = RollingFile appender.rolling.fileName = ${filename} appender.rolling.filePattern = logs/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d %-5p %-17c{2} (%30F:%L) %3x - %m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 2 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=10MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 5 # --- 业务包Logger配置(替换为你的实际业务包路径)--- logger.business.name = com.thp.clinic.allergiesConditions logger.business.level = info logger.business.additivity = false logger.business.appenderRef.rolling.ref = RollingFile logger.business.appenderRef.console.ref = STDOUT # --- Hibernate SQL日志配置 --- logger.hibernate.name = org.hibernate.SQL logger.hibernate.level = debug logger.hibernate.additivity = false logger.hibernate.appenderRef.rolling.ref = RollingFile logger.hibernate.appenderRef.console.ref = STDOUT # --- Root Logger配置(处理所有未被特定Logger匹配的日志)--- rootLogger.level = debug rootLogger.appenderRefs = rolling, stdout rootLogger.appenderRef.rolling.ref = RollingFile rootLogger.appenderRef.stdout.ref = STDOUT
关键修改说明
- 拆分Logger定义:用
logger.business和logger.hibernate分别配置业务包和Hibernate的日志,避免之前的覆盖问题。 - 启用Root Logger:设置
rootLogger.level = debug,确保控制器的测试日志这类未被特定Logger匹配的日志,会被Root Logger捕获并写入文件和控制台。 - 关闭日志重复输出:每个Logger的
additivity = false,避免同一条日志被当前Logger和Root Logger重复处理。 - 统一路径变量:用
${filename}引用日志文件路径,后续修改更方便。
验证方法
- 删除旧的
logs目录,重启Spring Boot应用。 - 调用测试API,检查
logs/test.log:你会看到控制器的DEBUG/INFO/WARN/ERROR/FATAL日志,以及Hibernate的DEBUG日志都被正确记录。 - 控制台也会同步显示所有级别的日志,如果需要控制台只显示特定级别,可以给控制台Appender添加级别过滤器。
内容的提问来源于stack exchange,提问作者Naveen Kumar
相关产品推荐
相关产品推荐

