如何在Log4j中启用Logger.debug()函数

66

当我试图执行以下代码时,只有最后两个语句被显示("Here is some ERROR" 和 "Here is some FATAL"),前三个语句没有被显示。由于我刚开始学习这个主题,请问这是为什么?

    logger.debug("Here is some DEBUG");
    logger.info("Here is some INFO");
    logger.warn("Here is some WARN");
    logger.error("Here is some ERROR");
    logger.fatal("Here is some FATAL");

log4j.property文件已经存在

log4j.rootLogger=debug,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%5p] %d{mm:ss}(%F:%M:%L)%n%m%n%n

但是我有log4j.properties,这不够吗? - Hariharbalaji
你能发布你的log4j.properties文件吗? - Thomas Owens
2
你不应该将其命名为log4j.property,而应该是log4j.properties - Rakesh Juyal
抱歉,在编辑时我犯了个错误,应该是log4j.properties。 - Hariharbalaji
2
也许这是一个愚蠢的问题,但是你是否告诉了你的记录器属性文件在哪里?你可以通过调用PropertyConfigurator.configure(pathToPropFile)来实现。 - quosoo
我应该在哪里进行这个调用?我有一个GWT应用程序,但我不知道在哪里可以调用PropertyConfigurator... - david
8个回答

70

你的项目中可能有一个 log4j.properties 文件。在这个文件中,你可以配置想要输出哪个级别的调试信息。看以下例子:

log4j.rootLogger=info, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

log4j.logger.com.example=debug

第一行将根记录器的日志级别设置为“info”,即仅将 info、warn、error 和 fatal 打印到控制台(这是稍微定义的 appender)。

最后一行将 com.example.* 的记录器(如果您通过 LogFactory.getLogger(getClass()) 获取您的记录器)设置为调试级别,即也会打印 debug。


4
可能还有一个 log4j.xml 文件,它是一种 XML 文件,用于代替 Java Properties 文件。 - Thomas Owens

56

下面是我偶尔在 JUnit 测试中使用的一个快速一行式 hack,用于暂时启用 log4j 调试日志:

Logger.getRootLogger().setLevel(Level.DEBUG);

或者如果你想避免添加导入:

org.apache.log4j.Logger.getRootLogger().setLevel(
      org.apache.log4j.Level.DEBUG);

请注意:这种方法在log4j2中不起作用,因为setLevel已经从API中删除,并且似乎没有相应的功能。


对于log4j2,请执行以下操作:Logger logger = LogManager.getRootLogger(); Configurator.setAllLevels(logger.getName(), Level.getLevel(level)); - Jeryl Cook

11

将名为log4j.xml的文件放入您的类路径中。其内容可以如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{1}:%L - %m%n"/>
        </layout>
    </appender>

    <root>
        <level value="debug"/>
        <appender-ref ref="stdout"/>
    </root>

</log4j:configuration>

2
他已经有一个Properties文件。我相信在最新版本的log4j中,建议使用XML,但并不要求这样做 - 也可以使用Properties文件。 - Thomas Owens
1
那么我应该怎么做来纠正这个问题呢? - Hariharbalaji

6
这可能是因为您的log4j配置设置为 ERROR 。请查找具有以下内容的log4j.properties文件:
log4j.rootLogger=ERROR, CONSOLE

# console logging
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %-20.20t %-24c{1}: %m%n

在这里,使用CONSOLE appender将rootLogger设置为ERROR级别。
请注意,某些附加器(如控制台附加器)还具有Threshold属性,可用于覆盖rootLoggers级别。在这种情况下,您需要检查两者。

6
如果您正在使用Apache Commons Logging和Log4j,但Log4j的工作结果不符合您的预期,请检查您的运行时类路径中是否实际存在log4j.jar文件。这曾经让我感到困惑一段时间。现在,在我的开发环境中,我已经配置了运行器,以便在Java命令行中始终包含-Dlog4j.debug,这样我就可以始终看到Log4j是否被正确初始化了。

请确保您没有使用 slf4j-simple jar,而是替换为 slf4j-log4j12。 - Jason

4

您需要将日志记录器级别设置为您想要显示的最低级别。例如,如果您想要显示DEBUG消息,则需要将日志记录器级别设置为DEBUG。

Apache log4j手册中有一个关于配置的部分。


我不知道上一个程序的问题在哪里,但我复制了相同的代码并在不同的路径下执行,现在它可以工作了。 - Hariharbalaji

3

我喜欢使用滚动文件附加器来将日志信息写入文件。我的log4j属性文件通常如下所示。我更喜欢这种方式,因为我喜欢为不同的包需要不同程度的记录而进行特定包的记录。例子中只提到一个包。

log4j.appender.RCS=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RCS.File.DateFormat='.'yyyy-ww
#define output location
log4j.appender.RCS.File=C:temp/logs/MyService.log
#define the file layout
log4j.appender.RCS.layout=org.apache.log4j.PatternLayout
log4j.appender.RCS.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm a} %5 %c{1}: Line#%L - %m%n
log4j.rootLogger=warn
#Define package specific logging
log4j.logger.MyService=debug, RCS

2
这是因为您的记录器的日志级别设置为“error” - 因此,您只会看到严重程度为错误或更高级别的消息,这就是为什么您也会看到“fatal”消息的原因。
如果您在log4j.xml中将记录器的日志级别设置为“debug”,则应该可以看到所有消息。
请参阅log4j介绍以获取说明。

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