How to have multiple loggers with shared code also using the logger?

In ${catalina.home}/lib there is a jar file that contains class MyLog.  There 
is a function in it

public class MyLog
{
   public static Logger getLogger()
   {
      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
      URL log4j_properties = classLoader.getResource("log4j.properties");
      String loggerName = log4j_properties != null ? 
log4j_properties.toString() : "default";
      synchronized (MyLog.class)
      {
         Logger logger = 
Logger.getRootLogger().getLoggerRepository().exists(loggerName);
         if (logger == null)
         {
            logger = Logger.getLogger(loggerName);
            System.out.println("Created logger: loggerName=" + loggerName);
         }
         return logger;
      }
   }
}

The jar file in ${catalina.home}/lib contains common code used by all web 
applications, and it calls MyLog.getLogger() to write some logs.

My ROOT application in ${catalina.home}/webapps/ROOT and web service 
application in ${catalina.home}/webapps/mywebservice also call MyLog.

The intent of getLogger() above is to return the logger for the application 
currently being run.  I have verified that 
Thread.currentThread().getContextClassLoader().hashCode() has value1 for the 
ROOT application and value2 for the mywebservice application. 

We have the following two log4j.properties:
${catalina.home}/webapps/ROOT/WEB-INF/lib/root.jar!/log4j.properties
${catalina.home}/webapps/mywebservice/WEB-INF/lib/root.jar!/log4j.properties

The value of loggerName is the first one when we're running the ROOT 
application, and the second one when running the mywebservice application.  So 
far, so good.

After starting Tomcat, if we run the ROOT application first, then it will call 
MyLog.getLogger(), and the log4j.properties found by the call to 
Logger.getLogger() will be the first one above.  If we run mywebservice first, 
then Logger.getLogger() will find the second log4j.properties file.  Any 
subsequent call to Logger.getLogger() will use the same log4j.properties.  So 
suppose we run the ROOT application first, then the new logger will be 
initialized with the first log4j.properties above.  And then if mywebservice 
calls MyLog.getLogger(), a new logger will get created, but it will be based on 
the same log4j.properties file.  You can see this because all applications log 
to the same file (each of my log4j.properties specifies a different file).



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to