使用 Java 配置而不使用 web.xml 在 Spring MVC Webapp 中为 log4j2 提供初始化的正确方法是什么?
What is right way to supply initialization for log4j2 in a Spring MVC Webapp using Java Config and no web.xml?
我有一个带有 log4j2 的 Spring MVC Web 应用程序 (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-less 世界中,我尝试了这个:
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-less 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 中。
我还没有测试过,但以下应该值得一试;将 onStartup(…)
方法中的 servletContext.setAttribute(…)
调用替换为以下 Log4jConfigurer
调用:
Log4jConfigurer.initLogging("file:///path/to/log4j2.xml")
这基本上就是当您在 web.xml
文件的 <context-param>
中使用 log4jConfigLocation
时(通过 Log4jWebConfigurer
, see code)在幕后发生的事情。
我只是想知道这是否也适用于 log4j2,尽管我不希望 <context-param>
方式也适用于它。你还在用web.xml
文件的时候是不是也用了log4j2?
可能这有点太晚了,但您可以执行以下操作将 log4j2 配置设置为外部路径:
public class ApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
servletContext.setInitParameter(Log4jWebSupport.LOG4J_CONFIG_LOCATION, "file:///path/to/log4j2.xml");
我有一个带有 log4j2 的 Spring MVC Web 应用程序 (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-less 世界中,我尝试了这个:
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-less 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 中。
我还没有测试过,但以下应该值得一试;将 onStartup(…)
方法中的 servletContext.setAttribute(…)
调用替换为以下 Log4jConfigurer
调用:
Log4jConfigurer.initLogging("file:///path/to/log4j2.xml")
这基本上就是当您在 web.xml
文件的 <context-param>
中使用 log4jConfigLocation
时(通过 Log4jWebConfigurer
, see code)在幕后发生的事情。
我只是想知道这是否也适用于 log4j2,尽管我不希望 <context-param>
方式也适用于它。你还在用web.xml
文件的时候是不是也用了log4j2?
可能这有点太晚了,但您可以执行以下操作将 log4j2 配置设置为外部路径:
public class ApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
servletContext.setInitParameter(Log4jWebSupport.LOG4J_CONFIG_LOCATION, "file:///path/to/log4j2.xml");