【问题标题】:Log4J: problem with isDebugEnabled() methodLog4J:isDebugEnabled() 方法的问题
【发布时间】:2011-05-07 05:59:57
【问题描述】:

我正在努力使用 Log4J 和 isDebugEnabled() 方法。

当我执行时:

package org.test;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Test {
public static Logger logger = Logger.getLogger(Test.class.getName());

public static void main(String[] args) { (new Test()).test(); }

public void test() {
    System.out.println("Logger " + logger.getName());
    System.out.println("level: " + logger.getLevel());
    logger.setLevel(Level.DEBUG);
    System.out.println("level: " + logger.getLevel());
    System.out.println("debug? " + logger.isDebugEnabled());
}
}

我明白了:

Logger org.test.Test
level: null
level: DEBUG
debug? false

logger 级别显然是DEBUG,但是logger.isDebugEnabled() 返回false。 你知道如何解决这个问题吗?

编辑: 我尝试过使用其他版本的 log4j 和 Level 演员表,但它没有改变任何东西。

【问题讨论】:

  • 我正在使用 Log4J 1.2.14 运行它,我收到了debug? true
  • 我也刚刚在我们的构建上运行它,工作正常。
  • 你有 Log4J 配置文件吗?请在此处发布
  • 我正在使用 Log4J 1.2.8 获得 debug? true

标签: java debugging logging log4j


【解决方案1】:

您应该执行以下操作(来自 JavaDoc):

logger.setLevel((Level) Level.DEBUG);

--

我在我们的示例之间看到的唯一其他区别是您有:

public static Logger logger = Logger.getLogger(Test.class.getName());

我在哪里:

public static Logger logger = Logger.getLogger(Test.class);

99% 可能不是这样,但正如我所说,这是唯一的区别。

【讨论】:

  • 是的,我已经尝试过了,但它并没有改变任何东西。还是谢谢。
  • 它与logger.setLevel(Level.DEBUG); 完全相同(没有类型转换,OP 已经完成了)。
  • 戳了戳,只看文档说的。我随后在我们的构建中运行了该示例,它似乎工作正常(有和没有演员表)。
【解决方案2】:

我试图用这段代码重现它,但它对我有用:

package com.example;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LogTest {

  public static Logger logger = Logger.getLogger(LogTest.class.getName());

  public static void main(String[] args) {
    System.out.println(logger.getLevel());
    logger.setLevel(Level.DEBUG);
    System.out.println(logger.getLevel());
    System.out.println(logger.isDebugEnabled());
  }
}

输出:

null
DEBUG
true

我在这个测试中使用了 log4j-1.2.15。


因此,您的 log4j 版本可能存在问题 - 暂时切换到 1.2.14 或 1.2.15,然后检查问题是否仍然存在。

【讨论】:

    【解决方案3】:

    原因似乎是与通过 maven 引入的依赖项冲突。 我已经测试过删除其中一些依赖项,它终于奏效了。 我不明白为什么,但是……它有效!

    【讨论】:

    • 我冒昧地猜猜你从其中一个依赖项中获取旧版本的 log4j 并且它首先出现在类路径中。
    【解决方案4】:

    我建议你停止使用static Logger ....。有一个 very good article about the pros and cons 非常值得一读,尤其是如果您在服务器上。

    如果您可以考虑替代方案,我会提出的另一个建议是查看Slf4jLogBack。例如,Slf4j 不需要围绕调试日志的保护“if”语句,这反过来意味着更清晰的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 2018-04-12
      • 2016-12-07
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多