18

I am loading log4j.xml using the traditional way

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:conf/log4j.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

This works fine but now I need to load a different log4j.xml file based on which environment I am in which is defined by a environment variable/jndi entry .. so I was hoping that with new spring 3.1 property management I could just change this to

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:conf/log4j-${ENV-NAME}.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

and spring will load the correct log4j file in each environment but this doesnt works probably because web.xml is loaded before spring. I came across this method

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
<property name="targetMethod" value="initLogging" />
<property name="arguments">
 <list>
  <value>log4j-${ENV-NAME}.xml</value>
 </list>
</property>
</bean>

so essentially moving configuration of log4j into spring context file instead of web.xml. But this doesnt works either for some reason logging gets enabled in a way that everything is logged. So how can I use a different log4j.xml file based on an environment variable or loading it programmatically in the servletcontextlistener.

4

3 に答える 3

19

It's too late to help adeelmahmood, but hope others will benefit from my answer. The thing is adeelmahmood was right, this configuration:

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:conf/log4j-${ENV-NAME}.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

is working, but:

  • Log4jConfigListener should be registered before ContextLoaderListener in web.xml !!!
  • You must also remember that Log4jConfigListener assumes an expanded WAR file.

Then, if ENV-NAME environment variable is set, it works as expected.

By the way, ${ENV-NAME} can be used in spring config files as well! That's not everything... You can also use our env.property to set spring profile:

<context-param>
 <param-name>spring.profiles.active</param-name>
 <param-value>${ENV-NAME}</param-value>
</context-param>

This way you can set log4jConfigLocation and spring profile, both with one and the same env. variable.

BTW and just in case: using Maven profiles to have separate builds for dev, test and production isn't good practice. Read eg. http://java.dzone.com/articles/maven-profile-best-practices and remember: "Use profiles to manage build-time variables, not run-time variables and not (with RARE exceptions) alternative versions of your artifact".

于 2013-04-01T16:47:06.147 に答える
0

This might help too for more recent readers: in Log4j 2.7 (but it's probably older) the parameter name has been altered: see interface Log4jWebSupport :

/**
 * The {@link javax.servlet.ServletContext} parameter name for the location of the configuration.
 */
String LOG4J_CONFIG_LOCATION = "log4jConfiguration";
于 2016-12-27T13:20:23.543 に答える
0

By default, Spring Boot picks up the native configuration from its default location for the system (such as classpath:logback.xml for Logback), but you can set the location of the config file by using the logging.config property.

logging.config=classpath:log4j-<ENV-NAME>.xml

https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/html/howto-logging.html

于 2021-12-20T07:00:54.067 に答える