什么是使用Java Config但不使用web.xml在Spring MVC Webapp中为log4j2提供初始化的正确方法?
问题内容:
我有一个带有log4j2的Spring MVC Web App(4.0)。该webapp不使用任何web.xml,并通过Java Config进行配置。
Log4j2配置需要在外部配置文件中进行,而不是在类路径中。
在以前的web.xml版本中,我们有
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///path/to/log4j2.xml</param-value>
</context-param>
这有效。
在没有web.xml的新世界中,我尝试了以下操作:
public class WebappInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.out.println("WebappInitializer.onStartup()");
servletContext.setAttribute("log4jConfiguration", "file:///path/to/log4j2.xml");
这是行不通的。这似乎为时已晚,无论如何都行不通。日志显示:
ERROR StatusLogger No Log4j context configuration provided. This is very unusual.
WebappInitializer.onStartup()
并且没有发生log4j日志记录。
在无web.xml的Spring MVC应用程序中,用web.xml替换此上下文参数声明的正确方法是什么?
更新:
我可以通过添加以下web.xml来解决此问题:
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///path/to/log4j2.xml</param-value>
</context-param>
</web-app>
当然,必须有更好的方法!
问题答案:
我相信您可以像这样在运行时将log4j2重新配置为新的配置文件。
LoggerContext context = (LoggerContext)LogManager.getContext(false);
context.setConfigLocation(URI.create("path to file"));
context.reconfigure();
可以将其添加到您的onStartup中。