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]

Reply via email to