For applications deployed as EAR files, you can't expect a webapp's WEB-INF/lib/log4j.jar to be picked up by EJB's deployed outside that webapp.  In that case, you'd need to place it in some common upper level (not at all in WEB-INF/lib) where both the webapp and EJB can see it.  Of course, unless you have a server that allows you to manage the classloading behavior of an EAR file (i.e., set parent-last on the EAR as a whole), not just a WAR file, then you can't depend on classloading.

This is where logger repository selectors come in.  You can have a global log4j.jar file (i.e. in the server's global classpath) and still separate logger repositories.  You just need to use some environmental value as the key to the logger repositories in the selector, such as thread, classloader, or JNDI.  I think you might benefit from the latter.  One already exists in the log4j-sandbox tagged as Alpha3.  See the article I pointed to in my previous response for details.

There are caveats and you may find that shared libraries using statically defined loggers (e.g., 'static final Logger logger = Logger.getLogger("MyLoggerName")') end up logging to a different logger repository than you expected.  This occurs because the logger is only looked up once, so the logger repository used will be the first one looked up.  If one webapp looks it up first, it's logger repository will be used for the life of the library (i.e., until server restart).  Other apps using the library will have that library's logs going to the first application's logger repository.

I know of no good way around this that I know of.  Maybe Ceki has come up with a better way over the years in his work with Logback?  You might ask on that mailing list.

Jake

On Wed, 31 Mar 2010 10:35:23 +0800
 WM YEOH <[email protected]> wrote:
Hi Jake,

  Thank you for the article.

  I tried to put the log4j jar under application classloader level as well
as war WEB-INF/lib, and set the delegate to false in sun-web.xml, and that
works fine. However, I got class not found exception when came across EJB
classes. I even specified the log4j jar in manifest file but no luck.

  I couldn't find any useful information how to configure sun apps to load
parent-last. I am wondering is it no other way to have EJB classes reference
log4j? Appreciate if you can again point me to the right direction.

  Thank you.

Regards,
Wooi Meng



On Mon, Mar 29, 2010 at 10:57 PM, Jacob Kjome <[email protected]> wrote:

Research Logger Repository Selectors.  Here's a resource to get you
started....
http://wiki.apache.org/logging-log4j/AppContainerLogging

Jake



On Mon, 29 Mar 2010 17:51:56 +0800
 WM YEOH <[email protected]> wrote:

Hi there,

Current setup,
- App server - Sun Java System Application Server 9.1_01
- deploy one ear(own war) and another war applications in the same stand
alone instance

I have setup in a way that each application has its own log4j.xml but
assign
to different log files, for instance, log4jA.xml -> A.log and log4jB.xml
->
B.log. However, the debug message only written into one log file instead
of
its designated log file. I could not package the log4j jar into the war as
other classes in separate jar (within ear) used logger. Therefore, I have
to
specified log4j jar in the server classpath. Which I believed that would
be
the issue that causing the debug message not written to the correct log
file.

I am wondering is there any settings to solve the problem that I faced. Or
is there any alternatives to solve the problem.

Appreciate anyone help me to solve the problem as soon as possible. Please
let me know if you need further information.

Thank you.

Regards



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to