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

问题描述 投票:0回答:8

尝试执行以下几行时,仅显示最后两条语句(“这是一些错误”和“这是一些致命”),并且不显示前三个语句。我刚刚开始学习这个主题,任何人都可以告诉我为什么会发生这种情况?

    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
java log4j
8个回答
71
投票

您的项目中可能有一个 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 会打印到控制台(这是定义在其下方的附加程序)。

最后一行设置 com.example.* 的记录器(如果您通过

LogFactory.getLogger(getClass())
获取记录器)将处于调试级别,即调试也将被打印。


57
投票

这是一个快速的单行技巧,我偶尔会用它在 JUnit 测试中临时打开 log4j 调试日志记录:

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

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

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

log4j2 的等价物是:

Logger logger = LogManager.getRootLogger(); 
Configurator.setAllLevels(logger.getName(), Level.getLevel(level))

感谢杰丽尔·库克


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>

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

此处使用

rootLogger
附加器将
ERROR
设置为
CONSOLE
级别。

请注意,某些附加程序(例如控制台附加程序)也具有

Threshold
属性,可用于否决
rootLoggers
级别。在这种情况下,您需要检查两者。


6
投票

如果您来到这里是因为您正在使用带有 log4j 的 Apache commons 日志记录,并且 log4j 没有按您的预期工作,那么请检查您的运行时类路径中是否确实有一个 log4j.jar。那个让我困惑了一会儿。我现在已经在我的开发环境中配置了运行程序,以在 Java 命令行中包含 -Dlog4j.debug,以便我始终可以看到 Log4j 正在正确初始化


4
投票

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

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


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
投票

发生这种情况是因为您的记录器的日志记录级别设置为“错误” - 因此您只会看到错误消息或严重程度高于此级别的消息,因此这就是为什么您还会看到“致命”消息。

如果您在 log4j.xml 中将记录器的日志记录级别设置为“调试”,您应该会看到所有消息。

查看 log4j 介绍以获取解释。

© www.soinside.com 2019 - 2024. All rights reserved.