Log4J:isDebugEnabled()方法出现问题

4

我正在处理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

记录器级别显然是DEBUG,但logger.isDebugEnabled()返回false。 你有什么想法如何解决这个问题吗?
编辑: 我已经尝试了其他版本的log4j和Level转换,但没有改变任何东西。

3
我正在使用Log4J 1.2.14运行此程序,结果是debug? true - Bill the Lizard
1
我也在我们的构建上运行了它,工作正常。 - Nico Huysamen
1
你有Log4J的配置文件吗?请在这里发布。 - Hardcoded
1
我正在使用Log4J 1.2.8,得到了debug? true - jilles de wit
4个回答

5
我建议您停止使用static Logger ....。有一篇非常好的文章介绍了使用静态日志记录器的利弊,如果您在服务器上使用,请务必仔细阅读。
另一个建议是考虑使用Slf4jLogBack等替代方案。例如,Slf4j不需要在调试日志记录周围添加保护“if”语句,这意味着更清洁的代码。

1

我尝试用这段代码复现,但它在我的电脑上可以工作:

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,检查一下问题是否仍然存在。


1

原因似乎是通过Maven引入的依赖项发生了冲突。 我已经尝试删除其中一些依赖项,最终它成功了。 我不明白为什么,但是...它可以工作!


我猜你从这些依赖项中获取了一个旧版本的log4j,并且它首先出现在类路径中。 - drekka

0
你需要按照以下步骤操作(来自JavaDoc):
logger.setLevel((Level) Level.DEBUG);

--

我在我们的例子中看到的唯一区别是你有:

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

我有:

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

99%的可能性不是那个问题,但正如我所说,这是唯一的区别。


1
是的,我已经尝试过了,但它并没有改变任何东西。无论如何还是谢谢。 - julien
它与 logger.setLevel(Level.DEBUG); 完全相同(没有类型转换,因为 OP 已经完成了)。 - Buhake Sindi
我尝试了一下,只是看了文档上的说明。随后我在我们的构建上运行了示例,似乎正常工作(带或不带转换)。 - Nico Huysamen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接