views:

1529

answers:

3

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?

+2  A: 

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.

jackysee
A: 

You can also do that by dynamically changing the FILE property in the properties file using the PropertyConfigurator in code.

ruchika
A: 

The reason it didnt work because the log4j is present at the root location, instead let each war have a Log4j.jar in its WEB-INF/lib directory and remove the log4j.jar from the root.

For more info on this refer my blog article on this http://techcrawler.wordpress.com/

Sudhakar