拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Log4j 警告:“无法为 Logger 找到 Appender”

Log4j 警告:“无法为 Logger 找到 Appender”

白鹭 - 2021-11-19 2159 0 2

1. 概述

在本教程中,我们将展示如何修复警告,我们将解释appender 是什么以及如何定义它。此外,我们将展示如何以不同的方式解决警告。

2. Appender 定义

我们先来解释一下什么是appender。Log4j 允许我们将日志放入多个目的地。它打印输出的每个目的地称为appender 我们有用于控制台、文件、JMS、GUI 组件等的附加程序。

log4j 中没有定义默认的appender。此外,记录器可以有多个appender,在这种情况下,记录器将输出打印到所有appender中。

3. 警告信息说明

现在我们知道了appender 是什么,让我们了解手头的问题。警告消息说找不到记录器的附加程序。

让我们创建一个NoAppenderExample类来重现警告:

public class NoAppenderExample { private final static Logger logger = Logger.getLogger(NoAppenderExample.class); public static void main(String[] args) {
 logger.info("Info log message");
 }
 }

我们在没有任何 log4j 配置的情况下运行我们的类。在此之后,我们可以在控制台输出中看到警告以及更多详细信息:

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

4. 解決配置问题

默认情况下,Log4j 会查看应用程序资源的配置文件,该文件可以是 XML 或 Java 属性格式。现在让我们在资源目录下log4j.xml

<log4j:configuration debug="false">
 <!--Console appender -->
 <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
 <layout class="org.apache.log4j.PatternLayout">
 <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p %m%n"/>
 </layout>
 </appender>

 <root>
 <level value="DEBUG"/>
 <appender-ref ref="stdout"/>
 </root>
 </log4j:configuration>

我们定义了root记录器,它位于记录器层次结构的顶部。所有应用程序记录器都是它的子项并覆盖其配置。我们用一个 appender 定义了root记录器,它将日志放入控制台。


让我们NoAppenderExample类并检查控制台输出。结果,日志包含我们的语句

2021-05-23 12:59:10 INFO Info log message

4.1. Appender 可加性

不必为每个记录器定义一个 appender。给定记录器的日志记录请求将日志发送到为其定义的附加程序以及为层次结构中更高的记录器指定的所有附加程序。让我们用一个例子来展示它。


如果记录A定义控制台的appender和记录器B是一个孩子A ,记录B打印其记录到控制台了。仅当中间祖先中的可加性标志设置为true时,记录器才会从其祖先继承 appender。如果 additivity 标志设置为false ,则不会继承来自层次结构中更高记录器的 appender。


为了证明logger从祖先那里继承了 appender,让我们在log4j.xml文件中为NoAppenderExample logger

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
 <log4j:configuration debug="false">
 ... <logger name="org.1ju.log4j.NoAppenderExample" />
 ... </log4j:configuration>

让我们NoAppenderExample类。这一次,日志语句出现在控制台中。尽管NoAppenderExample logger 没有明确定义 appender,但它从root logger继承了 appender。

5. 配置文件不在类路径上

现在让我们考虑在应用程序类路径之外定义配置文件的情况。我们有两个选择:

  • java命令行选项指定文件路径-Dlog4j.configuration=<path to log4j configuration file>

  • 在代码中定义路径: PropertyConfigurator.configure(“<path to log4j properties file>”);

在下一节中,我们将看到如何在我们的 Java 代码中实现这一点。

6. 解決代码问题

假设我们不需要配置文件。我们把log4.xml文件去掉,修改main方法:

public class NoAppenderExample { private final static Logger logger = Logger.getLogger(NoAppenderExample.class); public static void main(String[] args) {
 BasicConfigurator.configure();
 logger.info("Info log message");
 }
 }

我们从BasicConfigurator类调用静态configure它将ConsoleAppender添加到root记录器。我们看一下configure方法的源码:

public static void configure() {
 Logger root = Logger.getRootLogger();
 root.addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %p %c %x - %m%n")));
 }

因为root logger 一直存在,我们可以通过编程方式向其添加控制台 appender。

7. 结论

关于如何解决有关缺少 appender 的 log4j 警告的简短教程到此结束。我们解释了 appender 是什么以及如何使用配置文件解决警告问题。然后,我们解释了 appender 可加性是如何工作的。最后,我们展示了如何解决代码中的警告。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *