Logging in web applications: Best practices?
java, log4j, logging, tomcat, web-applications
Solution
Customer needs to be able to change log-level without modifying anything in the *.war-file.
You can put logging framework configuration file (`log4j.xml` or `logback.xml`) outside of the WAR file. Also logback supports automatic reconfiguration when this file is changed.
It should be possible to have some kind of rolling-file-logging
Both log4j and Logback support rolling back of files, both based on size and date, see e.g. `RollingFileAppender`.
As another customer might want to use standard JUL-logging instead - I'd of course prefer to not hard-code the preferred library (Log4J in this case).
apache-commons-logging is fundamentally broken, use slf4j instead. Then you simply put different implementations on your CLASSPTH. Also the SLF4J API is quite pleasent.
Problem
During deployment of a web application (in test environment) on customer site we encountered a problem with logging of the application. I'll shortly try to describe the current situation: - Implementation uses Logger retrieved by java.util.logging and apache.commons.logging. - In the deployed packages exists a commons-logging.properties pointing to JUL. - Application is running on Tomcat 6.x The customer decided that he wants to use Log4J on tomcat and configured it so it works (generally) - of course it's not working for the mentioned application. As it seems that we need to change logging implementation anyway - i wanted to ask you for some best practices on how to implement logging in a web application. Following things should be possible: - Customer needs to be able to change log-level without modifying anything in the *.war-file. -> If he would have to modify the war-file he would have to do this for every new build ... - It should be possible to have some kind of rolling-file-logging (e.g.: max 10 files with max. 10mb each) - of course it should also be up to the customer to define and change this setting ... - As another customer might want to use standard JUL-logging instead - I'd of course prefer to not hard-code the preferred library (Log4J in this case).