classes in jars that are put in WEB-INF/lib are run in exactly the same
classloader as those in WEB-INF/classes. You need not do all the checking
of appenders and such. In fact, you are probably making bad assumptions on
behavior which is why you only ever see the System.out message. Simply do...
logger.info("log message");
No need to have the extra logMessage() method either. You are hardcoding
Level.INFO, so why not just use logger.info() directly in getBar()?
If you see no output from this, then you haven't configured things
properly. However, based on your configuration below, any class in com.foo
should log to info or higher severity and any class in com.bar should log
to debug or higher severity. Classes not in those packages (and are not
children of those packages) will log to error or higher severity. All
logging should go to the console appender which has been added to the root
logger which all other loggers will inherit from.
BTW, are you doing anything special in your InitServlet? If not, just let
autoconfiguration work for you. It will find log4j.properties and perform
configuration in a static initializer by default. No need to do this
manually unless you are doing something special. You are really over
engineering this. KISS.
Jake
At 04:48 PM 5/21/2005 +0000, you wrote:
>Hi,
>
>I'm a new log4j user. I want to use it in a j2ee web application--however,
>I want its components, packed in separate jars, to use the same logger(s),
>if possible. My configuration is shown below:
>
>j2ee web app
>=======
> webroot/
> WEB-INF/
> classes/
> log4jInitServlet (uses log4j props file)
> log4j.properties
> com.foo/ (classes in this package use logger)
>
>So far so good. I'm able to initialize a logger, and to log from any of the
>classes in "classes/".
>
>Now, I want to use this already-initialized logger to log from classes
>deployed in jar files in WEB-INF/lib/ . Is this possible? Thus far my
>attempts have been unsuccessful.
>
>For example, I have a separate java project, whose classes reside in package
>"com.bar", and which have been jar-ed and placed in WEB-INF/lib. One of
>those classes is something like this:
>
>package com.bar;
>
>import org.apache.log4j.*;
>
>class Bar {
> static Logger logger = Logger.getLogger(Bar.class.getName());
>
> public void getBar() {
> logMessage( "called getBar", Level.INFO);
> }
>
> private void logMessage(String msg, Level lvl) {
> if ( logger != null && logger.getAllAppenders().hasMoreElements() )
> logger.log(lvl, msg);
> else
> System.out.println("sysout:" + msg + " : " + lvl.toString());
> }
>}
>
>The idea is that Bar provides some functionality to the webapp, and I want
>calls to it logged. Again, though, I'd like Bar's logging to use the same
>logger(s) already-initialised by the webapp. My props file is as below:
>
>log4j.rootLogger=ERROR, A1
>log4j.appender.A1=org.apache.log4j.ConsoleAppender
>log4j.appender.A1.layout=org.apache.log4j.PatternLayout
>
># Set levels
>log4j.logger.com.foo=INFO
>log4j.logger.com.bar=DEBUG
>
>However, all log output from bar says "sysout", meaning it isn't using the
>logger. I suspect this may be classloader related, but am unsure.
>
>Would somebody enlighten me, please?
>
>(I did search the web, and will continue to do so -- but have not yet come
>across anything germane.)
>
>Regards,
>
>--A
>
>_________________________________________________________________
>Express yourself instantly with MSN Messenger! Download today - it's FREE!
>http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
>
>
>---------------------------------------------------------------------
>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]