解决log4j警告:未找到适用于日志记录器的附加器,请正确初始化log4j系统

如果你正在阅读这篇文章,你一定是在使用log4j框架并且遇到了下面的错误信息。

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

在独立应用程序中,如果Log4j没有找到appender,警告将输出到控制台;在运行在一些Servlet容器(如Tomcat或JBoss)中的Web应用程序的服务器日志中也会有这样的警告。Log4j没有找到appender的原因可能有多种,让我们来看看常见的原因以及如何解决它们。

    log4j.xml或log4j.properties文件不在类路径中。

这是最常见的原因,log4j框架会在您的应用程序的类路径中查找log4j.xml或log4j.properties文件。如果您有一个基于Maven的应用程序,您可以创建一个源文件夹,并将配置文件放在那里,如下图所示。如果您在Web应用程序中使用log4j,请在WEB-INF/classes目录中检查此配置文件。如果在那里找不到文件,则检查您的源文件夹是否正确配置。

    log4j配置文件的名称与以前不同。

Log4j会寻找标准的文件名,因此如果你的log4j配置文件名是myapp-log4j.xml或myapp-log4j.properties,那么log4j将无法自动加载它,并且你会收到标准的警告信息。对于独立的Java应用程序,你可以在使用之前,在main方法内部轻松地进行配置修复。例如;

/**
 * method to init log4j configurations, should be called first before using logging
 */
private static void init() {
	DOMConfigurator.configure("myapp-log4j.xml");
	// OR for property file, should use any one of these
	//PropertyConfigurator.configure("myapp-log4j.properties");
}

但是你不能使用这种简单的方法来处理Web应用程序,因为配置文件位于WEB-INF/classes目录中。你可以通过ServletContextListener进行这种配置,如下所示的代码。

public final class Log4jInitListener implements ServletContextListener {
 
    public void contextDestroyed(ServletContextEvent paramServletContextEvent)  { 
    }
 
    public void contextInitialized(ServletContextEvent servletContext)  { 
        String webAppPath = servletContext.getServletContext().getRealPath("/");
    String log4jFilePath = webAppPath + "WEB-INF/classes/myapp-log4j.xml";
        DOMConfigurator.configure(log4jFilePath);
        System.out.println("initialized log4j configuration from file:"+log4jFilePath);
    }
     
}

另一种方法是通过类似以下的Java选项设置log4j.configuration系统属性。

-Dlog4j.configuration=file:///path/to/your/myapp-log4j.xml

只要你掌握了这些初始问题,Log4j框架会根据文件扩展名智能地使用DOMConfigurator或PropertyConfigurator。这就是全部,一旦你掌握了这些初始问题,log4j就非常简单易用。参考文献:

  • Apache log4j Default Initialization Procedure
  • Log4j Tutorial for Standalone and Web application
bannerAds