Log4j2自定义Logger级别与Appender配置未生效问题排查
Log4j2日志级别与Appender未按预期工作问题
项目结构

代码文件
Main.java
package com.my.sample.MySampleProject; import org.apache.logging.log4j.Logger; import com.my.sample.package2.MyPackage2Class; import org.apache.logging.log4j.LogManager; public class Main { private static Logger logger = LogManager.getLogger(Main.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); MyPackage2Class classPack2 = new MyPackage2Class(); classPack2.printStatement(); } }
MyPackage2Class.java
package com.my.sample.package2; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyPackage2Class { private static Logger logger = LogManager.getLogger("MyLoggerPackage2"); public void printStatement() { logger.debug("Package2 Debug log message"); logger.info("Package2 Info log message"); logger.error("Package2 Error log message"); } }
log4j2.properties原配置
# Direct log messages to STDOUT appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n # Direct to a file appender.file.type = File appender.file.name = LOGFILE appender.file.fileName = sample/logs/log4j2.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n log4j.logger.MyLoggerPackage2=ERROR, STDOUT log4j.additivity.MyLoggerPackage2=false # Root Logger rootLogger=INFO, STDOUT, LOGFILE
预期与实际结果
预期逻辑
- 根日志级别设为INFO,关联STDOUT和LOGFILE Appender
- 自定义Logger「MyLoggerPackage2」级别设为ERROR,仅关联STDOUT且additivity设为false,预期仅控制台输出该Logger的ERROR级别日志
实际输出
控制台与日志文件输出一致:
[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message [ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message [INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message [ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
问题原因与解决方案
核心问题
你使用了Log4j 1.x的配置语法来配置Log4j2,而Log4j2的properties配置格式完全不同,导致自定义Logger的配置根本没有被加载生效。
Log4j2不识别log4j.logger.xxx和log4j.additivity.xxx这类旧语法,所以MyLoggerPackage2实际上没有被正确配置,它的日志会默认继承RootLogger的规则:级别INFO,同时输出到STDOUT和LOGFILE。
正确的配置写法
将自定义Logger的配置替换为Log4j2标准的properties语法:
# 配置自定义Logger MyLoggerPackage2 logger.package2.name = MyLoggerPackage2 logger.package2.level = ERROR logger.package2.appenderRefs = stdout logger.package2.appenderRef.stdout.ref = STDOUT logger.package2.additivity = false
修改后的完整log4j2.properties
# Direct log messages to STDOUT appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n # Direct to a file appender.file.type = File appender.file.name = LOGFILE appender.file.fileName = sample/logs/log4j2.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n # 自定义Logger配置(Log4j2标准语法) logger.package2.name = MyLoggerPackage2 logger.package2.level = ERROR logger.package2.appenderRefs = stdout logger.package2.appenderRef.stdout.ref = STDOUT logger.package2.additivity = false # Root Logger rootLogger=INFO, STDOUT, LOGFILE
解释
logger.package2.name:定义Logger的名称,对应代码里的MyLoggerPackage2logger.package2.level:设置该Logger的日志级别为ERRORlogger.package2.appenderRefs:指定关联的Appender集合(这里只关联stdout)logger.package2.appenderRef.stdout.ref:关联到名称为STDOUT的Appenderlogger.package2.additivity = false:禁止日志传递到父Logger(即RootLogger),避免重复输出到LOGFILE
修改后,MyLoggerPackage2的INFO级别日志会被过滤,仅ERROR级别日志输出到控制台,不会写入日志文件,符合预期。
内容的提问来源于stack exchange,提问作者Sumit
相关产品推荐
相关产品推荐

