What is right way to supply initialization for log4j2 in a Spring MVC Webapp using Java Config and no web.xml?

一笑奈何 提交于 2019-12-24 03:28:04

问题


I have a Spring MVC Web App (4.0) with log4j2. This webapp uses no web.xml and takes care of configuration through Java Config. Log4j2 configuration needs to take place in an external config file, not on the classpath.

In a previous incarnation with web.xml we had

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>file:///path/to/log4j2.xml</param-value>
</context-param> 

and this worked.

In the new web.xml-less world, I tried this:

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");

This does not work. It seems to happen too late and in any event doesn't work. The logs show:

ERROR StatusLogger No Log4j context configuration provided. This is very unusual.
WebappInitializer.onStartup()

and no log4j logging occurs.

What is the right way to replace this context-param declaration with web.xml in a web.xml-less Spring MVC app?

UPDATE:

I can make this problem go away by adding the following 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>

Surely, there must be a better way!


回答1:


I believe you can reconfigure log4j2 to a new config file during runtime like this.

     LoggerContext context = (LoggerContext)LogManager.getContext(false);
     context.setConfigLocation(URI.create("path to file"));
     context.reconfigure();

Could just add this to your onStartup.




回答2:


Probably this is a little too late, but you can do the following to set the log4j2 configuration to an external path:

public class ApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext)
        throws ServletException {
        servletContext.setInitParameter(Log4jWebSupport.LOG4J_CONFIG_LOCATION, "file:///path/to/log4j2.xml");



回答3:


I haven’t tested it but the following should be worth a try; replace your servletContext.setAttribute(…) call in the onStartup(…) method with the following Log4jConfigurer call:

Log4jConfigurer.initLogging("file:///path/to/log4j2.xml")

This is basically what happens under the hood when you use log4jConfigLocation in the <context-param> of a web.xml file (via Log4jWebConfigurer, see code).

I’m only wondering if this will also work with log4j2, although I wouldn’t expect the <context-param> way to work with it either. Did you also use log4j2 when you were still using the web.xml file?



来源:https://stackoverflow.com/questions/31169581/what-is-right-way-to-supply-initialization-for-log4j2-in-a-spring-mvc-webapp-usi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!