【发布时间】:2015-02-12 18:22:10
【问题描述】:
我们使用的是 Tomcat 7.0.54。
web.xml:
<context-param>
<param-name>log4jContextName</param-name>
<param-value>SabaLog4jContext</param-value>
</context-param>
有一个在加载时启动的示例 servlet
<servlet>
<servlet-name>startUp</servlet-name>
<servlet-class>foo.StartupServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
StartupServlet 简单如下:
public class StartupServlet extends HttpServlet {
@Override
public void init() throws ServletException {
getServletContext().setAttribute("test", "ATest");
super.init();
}
}
log4j2 无法使用${web:attr.test} 访问test 属性,我收到以下警告:
INFO: org.apache.logging.log4j.web.WebLookup unable to resolve key 'test'
Log4j2 似乎工作正常,但问题是它在我的启动之前启动。我尝试使用 servletContextListener 类但没有运气。
我还尝试在 web.xml 中禁用 Log4jAutoInitialization 并手动开始设置它们,如下所示。
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
但没有运气:(
log4j2.xml如下:
<property name="baseFolder">${web:rootDir}/../logs/${web:test}</property>
那么如何设置我的 web.xml 以便我的代码在 Log4j 上下文之前执行。
web.xml 还包含 spring 监听器:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
【问题讨论】:
-
你能发布你的 log4j2.xml 吗?你在哪里使用
${web:attr.test}?另外,不要忘记在 log4j-user 邮件列表 (logging.apache.org/log4j/2.x/mail-lists.html) 上提出这个问题或提出 Jira 票。 -
我已经更新了这个问题。正如我所提到的,问题似乎是加载顺序,log4j 总是在其他 servlet 到 ServletContextListner 之前启动。我还通过电子邮件发送到邮件列表。
标签: servlets servlet-filters log4j2 servlet-3.0 servletcontextlistener