我使用 Apache Jackrabbit 作为部署到单个 tomcat 容器的几个 Web 应用程序的内容存储库。为了将 jackrabbit 作为 jndi 资源,我在 tomcat/lib 中添加了 jackrabbit jar 及其所有依赖项(包括 slf4j 和 log4j),以使其可用于我的所有 Web 应用程序。但是日志记录有问题...
在启动 log4j 时提示没有找到附加项:
log4j:WARN No appenders could be found for logger (org.apache.jackrabbit.core.config.ConfigurationErrorHandler).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
现在 jackrabbit 和我的网络应用程序都不会产生任何日志记录语句。
我尝试将 log4j.xml 配置添加到 lib 目录,但不行。还尝试将它直接添加到长耳兔 jar 中,但没有成功。
如何为 tomcat/lib 中的依赖项以及 tomcat 中的每个 Web 应用程序配置 log4j?
最佳答案
从 log4j 警告中可以清楚地看出,在您的应用程序中 log4j 未初始化,我之前不确定您在应用程序中的表现如何,但现在您可以试试这个。 我在我的应用程序中使用了相同的方法,其中所有日志记录 jar 都存在于服务器 lib 目录中。
- 将 log4j.properties 放在您的项目 WEB-INF 目录中,并要求您的 servlet 在应用程序启动期间对其进行初始化。您可以编写一个启动 servlet,并在 init 方法中将此属性文件作为参数传递给 init。
例如:在您的 web.xml 中是这样的。
<servlet>
<servlet-name>MyLog4JInitServlet</servlet-name>
<servlet-class>test.MyLog4JInitServlet</servlet-class>
<init-param>
<param-name>log4j-properties-location</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
并且您可以像这样在您的 servlet 中使用 init 方法来初始化 log4j。
public void init(ServletConfig config) throws ServletException {
String log4jLocation = config.getInitParameter("log4j-properties-location");
ServletContext sc = config.getServletContext();
if (log4jLocation == null) {
BasicConfigurator.configure();
} else {
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
File logFile= new File(log4jProp);
if (logFile.exists()) {
System.out.println("Initializing log4j with: " + log4jProp);
PropertyConfigurator.configure(log4jProp);
} else {
System.err.println("*** " + log4jProp + " file not found, so initializing log4j with BasicConfigurator");
BasicConfigurator.configure();
}
}
super.init(config);
}
干杯
关于tomcat - Tomcat 库和每个 Webapp 中的 log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17888360/