How to configure multiple log4j for different wars in a single EAR?

jackysee picture jackysee · Apr 18, 2009 · Viewed 13.2k times · Source

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?

Answer

jackysee picture jackysee · Apr 20, 2009

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.