解决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