【问题标题】:Java Application: Getting Log4j To Work Within Eclipse EnvironmentJava 应用程序:让 Log4j 在 Eclipse 环境中工作
【发布时间】:2012-02-13 08:20:13
【问题描述】:

我已尽力设置 Eclipse 和我的 Java 应用程序以使用 log4j.properties 文件。但是,它似乎没有使用属性文件,我不确定为什么。

库:slf4j-api-1.6.1、slf4j-jdk14-1.6.1

在应用程序中,日志记录工作正常。我可以在 Eclipse 控制台中打印信息、警告和错误。

我想做的是更改日志级别以调试并将所有日志消息打印到控制台和日志文件。

我创建了一个log4j.properties 文件,如下所示:

log4j.rootLogger=DEBUG,console,file
log4j.rootCategory=DEBUG, R, O

# Stdout
log4j.appender.O=org.apache.log4j.ConsoleAppender

# File
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log4j.log

# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB

# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=5
log4j.appender.file.File=checkLog.log
log4j.appender.file.threshold=DEBUG

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.O.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n

我的目录结构如下:

My Project
--src/
----MYProject/
------*.java
--bin/
----MYProject/
------*.class
--log4j/
----log4j.properties

在 Eclipse 中我是这样的:

运行配置 -> 类路径(选项卡)->,右键单击 User Entries -> 添加“log4j”作为新文件夹,并保存。

然后在我的代码中我这样调用记录器(示例代码来演示我的方法,因此它可能存在语法错误):

package MYProject;
import org.slf4j.LoggerFactory;

public class MyClass{

  final org.slf4j.Logger test_logger = LoggerFactory.getLogger(MyClass.class);

  public MyClass(){}

  public someMethod(){
    test_logger.debug("Some Debug");
    test_logger.info("Some Info");
    test_logger.warn("Some Warning");
    test_logger.error("An Error");
  }

}

然后我调用someMethod,它会将INFOWARNERROR 打印到Eclipse 控制台。它不会打印DEBUG,也不会打印到文件中。

对于我可能做错的任何建议,我将不胜感激。

【问题讨论】:

    标签: java eclipse log4j slf4j


    【解决方案1】:

    在您的log4j.properties 之前的类路径中可能还有另一个log4j.propertieslog4j.xml 文件。打开项目的运行配置,并将 -Dlog4j.debug=true 添加为项目的 VM 参数。这将指示 log4j 在控制台上打印很多附加信息,包括它正在使用的配置文件。

    【讨论】:

    • 我玩过你的评论和 apines,这就是我想出来的。我无法在当前设置中添加 PropertyConfigurator,因为它是 log4j 库的属性,而不是 slf4j-jdk14(据我所知是 slf4j 的 log4j binder)库的一部分。将 VM 参数设置为 true 不会返回任何额外的调试。
    • 如果我除了 slf4j-jdk14 之外还引用实际的 log4j 库,我开始获得调试输出。只需添加引用即可使我的 log4j.properties 文件开始工作。这似乎可以满足我大约 90% 的需求。这增加了调试,但我在初始帖子中的给定类中打印的命令不再打印(test_logger.debug、test_logger.info 等)。我认为这是因为我添加的 log4j 库覆盖了我之前使用的 org.slf4j.Logger。我对如何让这两个库更好地协同工作有点困惑,有什么建议吗?
    • slf4j 只是日志的一个外观,您仍然需要将实际的日志库(在您的情况下为 log4j)添加到您的类路径中。见此链接:slf4j.org/manual.html#binding
    【解决方案2】:

    如果您正在使用日志记录外观slf4j,那么您需要通过包含该后端的相应 jar 文件来准确指定 一个 日志记录后端。在您的情况下,您已经在类路径中安装了slf4j-jdk14-x.x.x.jar,这只是一个通用的记录器后端。

    为了使用 log4j 后端,您需要删除 slf4j-jdk14-x.x.x.jar 并将其替换为 slf4j-log4j12-x.x.x.jar。如果你不删除它,slf4j 必须只选择一个后端 jar,而且可能不是你想要的。

    当然,您还需要类路径中的实际 log4j-x.x.x.jar 文件。

    一旦这些 jars 正确就位,-Dlog4j.debug 的 VM 参数将真正起作用,并有助于调试日志配置的来源。

    【讨论】:

    • 当您知道 CVE-2021-44228(又名 Log4Shell)是什么时,您会很高兴 log4j 在您的安装中默认不使用。
    【解决方案3】:

    您需要告诉您的代码使用属性文件。在完成任何日志记录之前,请输入

    PropertyConfigurator.configure("log4j/log4j.properties");
    

    【讨论】:

      【解决方案4】:

      您的目标目录中可能有旧版本。 清理项目并重试。

      除此之外,如果您没有通过 eclipse 添加 log4j.properties,则应确保 刷新 eclipse 项目

      【讨论】:

        【解决方案5】:

        在路径项目属性/库选项卡中删除项目的jre(JRE系统库)并重新设置jre!

        【讨论】:

        • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
        猜你喜欢
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        相关资源
        最近更新 更多