无法将应用日志级别设为Debug,log4j2.properties是否未被读取?
问题描述
在Apache Tomcat 9的Servlet应用中初始化Log4j2时,配置的包级别DEBUG未生效,控制台输出仅显示类级别的Logger和root Logger,包级Logger配置未被正确加载。
代码与输出
Java代码
private static Logger logger = LogManager.getLogger(MyClass.class); ... Enumeration enumerator = LogManager.getLoggerRepository().getCurrentLoggers(); while(enumerator.hasMoreElements()) { System.out.println("Logger ->"+((Logger)enumerator.nextElement()).getLevel().toString()); } enumerator = LogManager.getLoggerRepository().getCurrentLoggers(); while(enumerator.hasMoreElements()) { System.out.println("Logger ->"+((Logger)enumerator.nextElement()).getName().toString()); }
控制台输出
Logger ->ERROR Logger ->DEBUG Logger ->my.package.first.MyClass Logger ->root
配置文件与环境
log4j2.properties(路径:src/main/webapp/WEB-INF/)
# Set root logger level to DEBUG and its only appender to Console log4j.rootLogger=DEBUG, Console # Console appender configuration log4j.appender.Console.type=Console log4j.appender.Console.name=STDOUT log4j.appender.Console.layout.type=PatternLayout log4j.appender.Console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1} - %m%n # Define appenders appender.console.type = Console appender.console.name = CONSOLE appender.console.layout.type = PatternLayout appender.console.layout.pattern = %highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue} appender.file.type = File appender.file.name = FILE appender.file.fileName = logs/application.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n # Define loggers rootLogger.level = INFO rootLogger.appenderRef.console.ref = CONSOLE rootLogger.appenderRef.file.ref = FILE logger.my.package.first.name = my.package.first logger.my.package.first.level = DEBUG logger.my.package.first.appenderRef.file.ref = FILE logger.my.package.second.name = my.package.second logger.my.package.second.level = DEBUG logger.my.package.second.appenderRef.file.ref = FILE
web.xml配置
<listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <context-param> <param-name>log4jConfiguration</param-name> <param-value>log4j2.properties</param-value> </context-param> <context-param> <param-name>log4j2.debug</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>log4j2.verbose</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>log4j.shutdownHookEnabled</param-name> <param-value>true</param-value> </context-param>
依赖包(已放入Tomcat的lib目录)
- log4j-web-2.24.0
- log4j-core-2.24.0
- log4j-api-2.24.0
- log4j-jul-2.24.0
问题分析与解决方案
核心问题
- 配置语法混合冲突:
log4j2.properties中同时存在Log4j 1.x(log4j.前缀)和Log4j 2.x的配置语法,导致Log4j2解析时出现混乱,包级Logger配置未被正确识别。 - 配置文件路径错误:
web.xml中log4jConfiguration参数未指定完整路径,Log4j2无法从WEB-INF目录找到配置文件。 - 包级Logger未被触发初始化:代码中仅初始化了类级Logger,包级Logger未被显式引用,导致其未被创建加载。
解决步骤
1. 清理配置文件,统一使用Log4j2语法
删除所有Log4j 1.x风格的配置(log4j.前缀的行),修改后的log4j2.properties如下:
# Define appenders appender.console.type = Console appender.console.name = CONSOLE appender.console.layout.type = PatternLayout appender.console.layout.pattern = %highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue} appender.file.type = File appender.file.name = FILE appender.file.fileName = logs/application.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n # Root logger configuration rootLogger.level = INFO rootLogger.appenderRef.console.ref = CONSOLE rootLogger.appenderRef.file.ref = FILE # Package-level logger configuration logger.packageFirst.name = my.package.first logger.packageFirst.level = DEBUG logger.packageFirst.additivity = false logger.packageFirst.appenderRef.file.ref = FILE logger.packageSecond.name = my.package.second logger.packageSecond.level = DEBUG logger.packageSecond.additivity = false logger.packageSecond.appenderRef.file.ref = FILE
注:
additivity = false用于避免日志重复输出到root的Appender,可根据需求调整;Logger的标识名(如packageFirst)仅需唯一,不影响包匹配。
2. 修正配置文件路径
在web.xml中指定完整的配置文件路径:
<context-param> <param-name>log4jConfiguration</param-name> <param-value>/WEB-INF/log4j2.properties</param-value> </context-param>
3. 触发包级Logger初始化
在代码中显式获取包级Logger,确保其被加载:
// 触发包级Logger初始化 Logger packageLogger = LogManager.getLogger("my.package.first");
4. 检查类加载冲突
确保Tomcat的lib目录下没有Log4j 1.x的JAR包,避免类加载冲突导致配置解析异常。
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

