【问题标题】:How to enable Logger.debug() in Log4j如何在 Log4j 中启用 Logger.debug()
【发布时间】:2009-11-04 12:26:47
【问题描述】:

在尝试执行以下行时,仅显示最后两个语句(“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 还不够吗?
  • 你能发布你的 log4j.properties 文件吗?
  • 你不应该把它命名为log4j.property,它应该是log4j.properties
  • 对不起,我在编辑时犯了错误,它只是 log4j.properties
  • 也许是个愚蠢的问题,但你有告诉你的 Logger 属性文件在哪里吗?你可以通过调用 PropertyConfigurator.configure(pathToPropFile);

标签: java log4j


【解决方案1】:

您可能在项目的某处有一个 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()) 获取记录器)将处于调试级别,即也将打印调试。

【讨论】:

  • 它也可能是一个 log4j.xml 文件,它是一个 XML 文件,用来代替 Java 属性文件。
【解决方案2】:

将一个名为 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>

【讨论】:

  • 他已经有一个属性文件。我相信在最新版本的 log4j 中,建议您改用 XML,但不是必须这样做 - 可以使用 Properties 文件。
  • 那么我应该如何解决这个问题?
【解决方案3】:

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

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

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

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

注意:此 hack 在 log4j2 中不起作用,因为 setLevel 已从 API 中删除,并且似乎没有等效功能。

【讨论】:

  • 对于 log4j2 做这个 Logger logger = LogManager.getRootLogger(); Configurator.setAllLevels(logger.getName(), Level.getLevel(level));
【解决方案4】:

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

【讨论】:

  • 或者确保你没有使用 slf4j-simple jar 并替换为 slf4j-log4j12
【解决方案5】:

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

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

【讨论】:

  • 我不知道上一个程序有什么问题,但我复制了相同的代码并在不同的路径中执行,现在它可以工作了
【解决方案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 在此处使用 CONSOLE 附加程序设置为 ERROR 级别。

请注意,某些附加程序(例如控制台附加程序)也具有Threshold 属性,可用于否决rootLoggers 级别。在这种情况下,您需要同时检查两者。

【讨论】:

    【解决方案7】:

    我喜欢使用滚动文件附加器将日志信息写入文件。我的 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
    

    【讨论】:

      【解决方案8】:

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

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

      请查看log4j 介绍以进行解释。

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多