You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将应用日志级别设为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

问题分析与解决方案

核心问题

  1. 配置语法混合冲突:log4j2.properties中同时存在Log4j 1.x(log4j.前缀)和Log4j 2.x的配置语法,导致Log4j2解析时出现混乱,包级Logger配置未被正确识别。
  2. 配置文件路径错误:web.xml中log4jConfiguration参数未指定完整路径,Log4j2无法从WEB-INF目录找到配置文件。
  3. 包级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:34:55