I am using apache commons + log4j for my web app.
normally log4j needs a configuration file inside the classpath; but I need to delegate the logging configuration to an external file (I need to deploy a .war in an environment, but the log configurations (max size, position, etc) it's up to a second team.
I have a commons-logging.properties in my classpath
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
# log4j.configuration=/absolute/path/where/external/logs/are/log4j.properties
unfortunately, the commented line doesn't work.
Is there a way to set up log4j with an external configuration file?
You can use a jvm parameter indicating the configuration file path:
example with an absolute path:
Set the system property log4j.configuration=/abslute/or/relative/path_to_file_name
commons logging only needs to know what logging implementation it's using, the logging implementation it self is configured in whatever way it is always configured in.
This is documented in the log4j manual.
You can set it as a system property
log4j.configuration
property .. for example in J2SE appNote, that property value must be a URL.
For more read section 'Default Initialization Procedure' in Log4j manual.
It's also possible letting a ServletContextListener set the System properties:
And then put this into your web.xml (should be possible for context.xml too)
I got this from this listener code from answer .
I hope this could help you!
If you are using the Spring Framework, you can use the
org.springframework.web.util.Log4jConfigListener
.You only need to specify the parameter
log4jConfigLocation
with the file location (using the URL for File). e.g.:You can specify the
log4jRefreshInterval
, the interval between config file refresh checks, in milliseconds.See more in the javadoc of
org.springframework.web.util.Log4jWebConfigurer
.