【问题标题】:log4j:WARN No appenders could be found for logger - Using slf4j-log4j12log4j:警告找不到记录器的附加程序-使用 slf4j-log4j12
【发布时间】:2013-05-19 13:15:39
【问题描述】:

这个问题好像被问过很多次了。但是我尝试过的所有解决方案(主要是确保 log4j.properties 文件位于正确的位置并且输入正确)在我的情况下都不起作用。

我有一个 Maven 项目。我想使用 log4j 进行测试。测试类使用 src/main/java 中定义的辅助方法,其中使用了记录器。

在我的助手类中(在 src/main/java/ 中)我已经导入了

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

我已经实例化了记录器

private static final String TAG    = Helper.class.getSimpleName();
private static final Logger logger = LoggerFactory.getLogger(TAG);

我在 src/main/resources 和 src/test/resources 中都包含了以下 log4j.properties 文件

### set log levels - for more verbose logging change 'info' to 'debug' ###
### Also add logfile to the root, if need stdout then add stdout appender here###
log4j.rootLogger=debug, stdout

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd-mm HH:mm:ss,SSS} %p/%c{1}:%L - %m%n

在我的 POM 中,我包含了对 slf4j 的依赖

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
</dependency>

在我的助手类的代码中,我以这种方式使用记录器

logger.debug("logger test...");

控制台中没有打印任何消息,我收到以下警告消息

log4j:WARN No appenders could be found for logger (Helper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我错过了什么?

更新

该问题与将 log4j.configuration 属性设置为 log4j-test.xml 的项目选项有关。我已将以下插件添加到项目 maven pom 中,这解决了问题。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14.1</version>
    <configuration>
      <systemPropertyVariables>
        <log4j.configuration>log4j.properties</log4j.configuration>
      </systemPropertyVariables>
    </configuration>
  </plugin>

【问题讨论】:

  • 将 -Dlog4j.debug 添加到 JVM 参数中,以查看 log4j 正在获取的配置文件究竟是什么

标签: java maven log4j slf4j


【解决方案1】:

从您发布的部分来看,它看起来不错。所以让我们调查一下这个问题。 我做了一个简单的项目(只有2个类Helper:有一个方法来调用你的logger语句,AppTest:一个JUnit测试来调用Helper中的方法)

  1. 清理生成的代码
    mvn clean
    存在以下文件
    ./src/main/java/sub/optimal/mavenexample/Helper.java
    ./src/main/resources/log4j.properties
    ./src/test/java/sub/optimal/mavenexample/AppTest.java
    ./src/test/resources/log4j.properties

  2. 编译代码
    mvn 编译
    存在以下文件
    ./src/main/java/sub/optimal/mavenexample/Helper.java
    ./src/main/resources/log4j.properties
    ./src/test/java/sub/optimal/mavenexample/AppTest.java
    ./src/test/resources/log4j.properties
    ./target/classes/log4j.properties
    ./target/classes/sub/optimal/mavenexample/Helper.class

    如果properties文件没有复制到目标目录需要查找原因

  3. 一些起点,检查输出

    mvn -debug 编译
    mvn -Dlog4j.debug 测试

【讨论】:

  • 嗨,SubOptimal,log4j.properties 已正确复制到 target/classes 目录中。但是,当我运行 mvn -Dlog4j.debug test 命令时,我得到以下输出:log4j: Trying to find [log4j-test.xml] using context classloader sun.misc.Launcher$AppClassLoader@b92d342。 log4j:尝试使用 sun.misc.Launcher$AppClassLoader@b92d342 类加载器查找 [log4j-test.xml]。 log4j:尝试使用 ClassLoader.getSystemResource() 查找 [log4j-test.xml]。 log4j:找不到资源:[log4j-test.xml]。看起来它不查找 .properties 文件。我不明白为什么
  • 嗨 Piero,因为它会查找 log4j-test.xml,它不是默认的 log4j 配置文件名,所以必须在某个位置进行配置。可能在您的配置中有一个选项-Dlog4j.configuration=log4j-test.xml,或者系统属性是以编程方式设置的。看看吧。
  • 嗨次优。是的,我仍然不知道为什么以及在哪里设置了这个配置变量。但我找到了解决它的方法。看我的更新。感谢您提供有关如何显示 log4j 调试输出的提示。
【解决方案2】:

试试这些命令...

$ 未设置 FLUME_HOME

然后尝试.....

它对我有用....

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多