Here's an update on the logger issue. It too me long to figure out because I ran into an issue about privileged servlets and had to write my own log4j.properties parser.
The original code posted earlier in this thread works in that it creates a different logger for web application, and allows the user to stop and restart the application. public static Logger getLogger() { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); URL log4j_properties = classLoader.getResource("log4j_app.properties"); String loggerName = log4j_properties.toString(); // throws NullPointerException if log4j_app.properties does not exist synchronized (MyLog.class) { Logger logger = Logger.getRootLogger().getLoggerRepository().exists(loggerName); if (logger == null) { logger = Logger.getLogger(loggerName); PropertyConfigurator.configure(log4j_properties); System.out.println("Created logger: loggerName=" + loggerName); } return logger; } } One bug with the above is the line PropertyConfigurator.configure(log4j_properties); The above re-configures the root logger with the new log4j.properties, so basically the new configuration applies to all loggers. What would be nice is PropertyConfigurator.configure(logger, log4j_properties); that configures only the specified logger with the log4j_properties. Unfortunately, log4j does not have such a function, so I wrote my own (but it only supports the properties used in my log4j_app.properties files). Now, if web application 1 calls MyLog.getLogger() or calls common code that calls MyLog.getLogger() then the first logger will be used, and similarly for web application 2. Finally, I create a servlet import org.apache.catalina.manager.ManagerServlet; public class TomcatManagerServlet extends ManagerServlet The servlet is called for "/reload", and it calls super.doGet() after doing some checks. It turns out that only privileged web applications can instantiate ManagerServlet, so one has to have the following in context.xml: <Context privileged="true"> I'm not sure what is the practical impact of setting privileged="true", though the docs said something about the catalina and shared class loaders. So upon calling http://localhost/mywebservice/reload?path=/ the ROOT application is stopped and started. After the application restart, all users are logged out and they have to log in again, but the logger continues to work. A call to MyLog.getLogger() does not re-create the logger. The logger is really owned by the common code in ${catalina.home}/lib. The code URL log4j_properties = classLoader.getResource("log4j_app.properties"); just gets the URL of the log4j.properties file. However, there is no pointer to anything in the webapp, so it's possible to stop the webapp. And the line PropertyConfigurator.configure(log4j_properties); opens the URL (by calling log4j_properties.getInputStream()), reads it, and closes it. So no stream in the webapp is open, and it's possible to stop the webapp. --- On Thu, 1/15/09, Caldarale, Charles R <chuck.caldar...@unisys.com> wrote: > From: Caldarale, Charles R <chuck.caldar...@unisys.com> > Subject: RE: How to have multiple loggers with shared code also using the > logger? > To: "Tomcat Users List" <users@tomcat.apache.org> > Date: Thursday, January 15, 2009, 11:28 AM > > From: removeps-gro...@yahoo.com > [mailto:removeps-gro...@yahoo.com] > > Subject: RE: How to have multiple loggers with shared > code > > also using the logger? > > > > How does one redploy a single application? Strange, I > > could not find any information on this seemingly basic > > task on google. > > Read the real docs first, then Google only if needed. > http://tomcat.apache.org/tomcat-6.0-doc/deployer-howto.html#Deploying%20on%20a%20running%20Tomcat%20server > http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html > > - Chuck > > > THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR > OTHERWISE PROPRIETARY MATERIAL and is thus for use only by > the intended recipient. If you received this in error, > please contact the sender and delete the e-mail and its > attachments from all computers. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: > users-h...@tomcat.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org