java log4j:无法将日志记录设置为DEBUG

zkure5ic  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(334)

我有一个问题log4j ---我试图设置日志级别为DEBUG与log4j.properties文件.我知道这部分工作,因为另一个组件(netty)的工作,但到了我的时候,日志被设置为错误和以上.
以下是我的log4j.properties文件:

#Define root logger options
log4j.rootLogger=DEBUG, console

log4j.logger.com.ltsllc.miranda=DEBUG

#Define console appender

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p %c{1} - %m%n

下面是检查调试级别的代码:

if (l.isDebugEnabled()) {
        l.debug("DEBUG is enabled");
    } else {
        l.error ("Debug is disabled");
        l.error ("level is: " + l.getLevel());
    }

下面是输出:

DEBUG ResourceLeakDetector - -Dio.netty.leakDetection.level: simple
DEBUG ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
DEBUG ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@44b3606b
22:43:46.696 \[main\] ERROR com.ltsllc.miranda.Miranda - Debug is disabled
22:43:46.700 \[main\] ERROR com.ltsllc.miranda.Miranda - level is: ERROR
DEBUG DefaultChannelId - -Dio.netty.processId: 30572 (auto-detected)
DEBUG NetUtil - -Djava.net.preferIPv4Stack: false

我就料到会这样

DEGUG com.ltsllc.miranda.Miranda - DEBUG is enabled
rqqzpn5f

rqqzpn5f1#

从您提供的详细信息来看,问题可能源于各种来源:
1.验证日志初始化:确保“l”日志记录器为“米兰达”包正确初始化。您可能正在使用用于不同软件包的日志记录器,导致它无法获取DEBUG设置。
下面是一个例子:

import org.apache.log4j.Logger;

public class Miranda {
    private static final Logger l = Logger.getLogger(Miranda.class);
}

1.确认您的配置文件位置:检查log4j.properties文件的位置是否正确。它必须在类路径上。对于Maven项目,通常将其放在src/main/resources目录中。
1.检查多个配置:如果您有多个log4j配置文件(如log4j.xml和www.example.com),则Log4j可能从错误的文件中提取log4j.properties。最好只有一个配置文件,或者特别指出要使用哪一个。
1.log4j配置可能被覆盖:某些库或框架可能会无意中覆盖log4j配置。例如,Sping Boot 默认自动配置日志记录。这是值得考虑的,如果类似的事情可能会发生在你的情况。
1.考虑初始化顺序:日志记录系统的初始化可能晚于某些代码。请确保在应用程序生命周期中尽早初始化它。
检查这些潜在原因应有助于您识别和解决问题。

nnt7mjpx

nnt7mjpx2#

当没有提供配置时,Log4j2参考实现(log4j-core)使用%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n模式和ERROR级别。这就是您在标准输出中观察到的。
日志API和后端可能绑定如下:

  • Netty的内部日志API(参见InternalLoggerFactory)绑定到SLF4J(slf4j-api),后者使用Log4j 1.x或Reload4j作为后端。此后端是您配置的后端
  • 您在代码中使用的Log4j2 API(参见API separation)绑定Log4j2参考实现,您未配置。我猜您的代码中l的完全限定类名是org.apache.logging.log4j.Logger

我假设你不想使用Log4j 1.x作为后端(它在8年前就被宣布生命周期结束了),所以你需要:
1.通过添加包含以下内容的log4j2.xml文件来配置log4j-core

<Configuration>
  <Appenders>
    <Console name="console">
      <PatternLayout pattern="%-5p %c{1} - %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="console"/>
    </Root>
  </Loggers>
</Configuration>
  • 修复您的依赖项,方法是:
  • 从类路径中删除log4j:log4jch.qos.reload4j:reload4j工件。这还包括SLF4J绑定org.slf4j:slf4j-log4j12org.slf4j:slf4j-reload4j
  • 如果SLF4J(slf4j-api)不存在,但其他库可能直接使用SLF4J,则Netty绑定到Log4j2 API。如果你正在使用Maven,你需要这三个工件:
<dependencyManagement>
   <!-- Add the BOM, so you don't need to specify version -->
   <dependencies>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-bom</artifactId>
       <version>2.20.0</version>
       <scope>import</scope>
       <type>pom</type>
     </dependency>
   </dependencies>
 </dependencyManagement>
 <dependencies>
   <!-- Used in your code -->
   <dependency>
     <groupId>org.apache.logging.log4j</groupId>
     <artifactId>log4j-api</artifactId>
   </dependency>
   <!-- Only necessary at runtime -->
   <dependency>
     <groupId>org.apache.logging.log4j</groupId>
     <artifactId>log4j-core</artifactId>
     <scope>runtime</scope>
   </dependency>
   <!--
     ~ If some of your libraries use SLF4J API directly
     ~ bind them to `log4j-api`:
     -->
   <dependency>
     <groupId>org.apache.logging.log4j</groupId>
     <!-- Replace with log4j-slf4j2-impl if SLF4J 2.x is used -->
     <artifactId>log4j-slf4j-impl</artifactId>
     <scope>runtime</scope>
   </dependency>
 </dependencies>

如果您的库使用其他日志API(例如Jakarta Apache Commons Logging、java.util.logging、JBoss Logging),您还需要将它们绑定到log4j-api
编辑:我建议不要使用Log4j 2.x的属性配置格式,因为以平面格式存储树状结构非常冗长。此外,在Log4j 1.x发布时,JRE没有XML解析器,现在它有了。

上面的XML配置可以转换为属性:

appender.0.type = Console
appender.0.name = console
appender.0.0.type = PatternLayout
appender.0.0.pattern = %-5p %c{1} - %m%n

logger.rootLogger.level = DEBUG
logger.rootLogger.appenderRef.0.ref = console
##
# The `rootLogger` config can be abbreviated in recent versions to
#   logger.rootLogger = DEBUG, console
lbsnaicq

lbsnaicq3#

我在一个关于如何以编程方式设置日志记录级别的问题中找到了答案:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); 
loggerConfig.setLevel(level);
ctx.updateLoggers();  // This causes all Loggers to refetch information from their LoggerConfig.

这就是this question的答案

相关问题