I have a EAR with structures like:
APP.ear
- APP1.war
- WEB-INF/classes/log4j.properties
- APP2.war
- WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)
I want each WAR to have their own application log. But it seems the above configuration does not work. Log for APP1 and APP2 goes to APP1's log. Is there anyway to create separate app logs?
It turns out that it's impossible due to the classloader. The classloader hierarchy is like:
Application classloader -> Ejb classloader -> war classloader
To have a sepearte log for individual war, one can put log4j.jar inside war and let the log4j uses the war classloader. But as both app1-ejb.jar and app2-ebj.jar also need to use log4j, the log4j.jar can only be placed at the top level. So the log4j is on application classloader level.
I can specify a single log4j config to log different package to different files. But for the common library like spring, the log cannot be sepearted.