log4j.xml - WARN找不到记录器的appender

时间:2013-11-22 14:35:59

标签: xml log4j

我喜欢用log4j loger来完成我的简单项目。

但是当我运行项目时,我会在控制台的log4j上发出紧急警告:

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

我无法弄清楚为什么会发生这种情况。

我添加并下载了与Maven一起使用的log4j,这一切都应该可以。

我指定了apeender,我觉得它应该可以正常工作 但是你可以看到它不是。

以下是我log4j.xml的内容:

<!-- Appenders -->
<!-- Loggin into console -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p: %c - %m%n" />
    </layout>
</appender>
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="/logs/log.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p (%F:%L:%M)  %c{1}  - %m%n" />
    </layout>
</appender>

<!-- Root logger -->
<root>
    <priority value="info" />
    <appender-ref ref="file" />
    <appender-ref ref="console" />
</root>

<!-- Application Loggers -->
<logger name="com.softserve.edu">
    <level value="info" />
</logger>

我错过了标准页眉和页脚(标签)。

一个很滑的地方是这个文件进入logs文件夹不存在(我想log4j会自己创建它)。

这是我的项目进展:

project struckture

更新

我在src/test/resources下创建了新文件夹,并将log4j.xml移至。

现在一切正常,但是没有创建log文件。

此行<param name="file" value="/logs/log.log" />有什么问题?

  • 如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您的log4j.xml文件需要放在目录src / main / resources中。 Log4J希望在类路径的根目录找到它。

资源目录是放置所有非Java代码但你想要进入类路径的东西的地方。如果它只是测试应该使用的东西,把它放在src / test / resources中,否则使用src / main / resources。

答案 1 :(得分:2)

我最终努力自己回答这个问题,所以:在l0g4j网站上,这是一个FAQ,错误实际上指向了你。

http://logging.apache.org/log4j/1.2/faq.html#noconfig

正如你所知道的(但对于遇到这个常见错误的外行人):Appender是输出的地方。您可以拥有控制台Appender,文件Appender以及其他所有在指示中拼写的内容。

当log4j告诉你它没有注册Appender时,它告诉你输出无处可去。这就是为什么,除了错误之外,你的应用程序可能是沉默的。

鉴于你确实已经指定了Appender,错误实际上只是其中的一件事。

如果Appender以某种方式出现格式错误,您可能会看到一个解析异常,所以这可能不是问题。

但是,如果无法找到日志配置文件.....你会看到这个问题!您的应用程序很可能根本看不到配置文件,并且正在尝试使用默认值。

如何进入这种状态包括:

  • 未遵守maven惯例或提供替代配置。 (解决方案可以在Nathan Hughes的回答中找到)。
  • 指定一个看起来正确的替代Maven配置(足够maven运行)但未能按照您的想法执行。
  • 配置Log4j in-code以查找应用程序不可见的文件

当您将文件放入./src/main/resources时,Maven实际上将logger.xml捆绑到jar中。这将它放在类路径上,这是记录器默认查看的位置(显然jar在类路径上)。

但是,许多用户不希望在“二进制”jar中看到内部的日志记录配置。如果你必须重新编译,或者基本上对zip文件中的配置进行凌乱的就地编辑,那么配置日志级别有什么意义呢?因此,对于许多人来说,Nathan Hughes的答案是不回答的,这就是为什么值得谈论其他场景的原因。

如果您已经使用jar打包了配置文件,那么软件就没有找到正确的位置。如果您已经完成了自己移动文件的任何工作,那么您可能已经隐藏了自己的log4j.xml文件。

但是,您很可能使用maven约定./src/main/config/log4j.xml打包文件。如果是这种情况,则问题是您的软件未配置为查找它。

一种方法是在调用应用程序时在命令行上指定

-Dlog4j.configuration=file:conf/log4j.xml 

如果您是代码中的硬代码(我不是)的粉丝,那么应该是一个电话

对于.properties文件:

File log4jfile = new File("./conf/log4j.properties");
PropertyConfigurator.configure(log4jfile.getAbsolutePath());

对于.xml文件:

DOMConfigurator.configure("file:///conf/log4j.xml");
Logger log = Logger.getLogger(YourClass.class);