Hello Ralph, Your recommendation for the code has worked well and the web lookup is now working as needed - which is great.
Thanks again for all the help! PM. On 11 April 2015 at 17:58, Ralph Goers <[email protected]> wrote: > If the code below is yours than I would recommend having it extend > Log4jServletContainerInitializer and then have the first line of your > onStartup() method do super.onStartup(). That should make sure that Log4j > initializes before Spring. You can also remove the > Log4jServletContextListener from your web.xml if it is there. > > Ralph > > > On Apr 11, 2015, at 4:05 AM, Ponder Muse <[email protected]> > wrote: > > > > Hi Ralph, > > > > I had a dig around to see what might be triggering the log4j > configuration > > off before the servlet has had a chance to initialise and, I believe it > > might be the Spring code itself? > > > > Our deployments are all Spring 4 and java annotation based. i.e. no xml > > configuration aside from simple WEB-INF/web.xml file. So, a deployment > init > > and startup is generally kicked off via the following code: > > > > import javax.servlet.ServletContext; > > import javax.servlet.ServletException; > > > > import org.springframework.web.WebApplicationInitializer; > > import org.springframework.web.context.ContextLoaderListener; > > import > > > org.springframework.web.context.support.AnnotationConfigWebApplicationContext; > > > > public class WebInitialiser implements WebApplicationInitializer { > > > > public void onStartup(ServletContext servletContext) throws > > ServletException { > > > > // log4j2 web lookup caused by the creation of the rootContext > > object. > > AnnotationConfigWebApplicationContext rootContext = new > > AnnotationConfigWebApplicationContext(); > > > > rootContext.register(ApplicationConfig.class, > > IntegrationConfig.class, JmsConfig.class, JmxConfig.class); > > > > servletContext.addListener(new > ContextLoaderListener(rootContext)); > > > > } > > } > > > > Now, I think the log4j2's web lookup failure arises because of the > creation > > of the AnnotationConfigWebApplicationContext class object (If I comment > the > > creation of that object out, then the servlet starts up okay and log4j2's > > web lookup resolves okay too - but of course the servlet is useless as it > > no longer has our business code loaded behind it!). > > > > I had a look inside the AnnotationConfigWebApplicationContext class and, > I > > can see that the class extends > > org.springframework.context.support.AbstractApplicationContext which has > > the following line: > > > > protected final Log logger = LogFactory.getLog(getClass());. > > > > The Log and LogFactory classes are imported as follows: > > > > import org.apache.commons.logging.Log; > > import org.apache.commons.logging.LogFactory; > > > > Can this be the reason why the log4j2 configuration is being scanned > before > > the servlet context has had a chance to initialise? And therefore log4j2 > is > > unable to do the web lookup? > > > > The spring-web project does have a web-fragment defined in it called > > spring_web and in my deployment's web.xml I have tried including the > > following snippet: > > > > <display-name>service-name</display-name> > > > > <absolute-ordering> > > <name>log4j</name> > > <name>spring_web</name> > > <others/> > > </absolute-ordering> > > > > But it doesn't solve the web lookup issue. (I am not sure how to prove > > whether the fragment ordering is actually being followed during startup > > though...) > > > > Any thoughts on any of this would be much appreciated. I have so far not > > even have any workarounds for this issue... > > > > Cheers, > > PM. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
