Re: Creating Loggers at Deployment Time
Patrick, I have done this using a the Java logging API in conjunction with a context listener. When your application loads, you have the context listener configure the logger to do the output you want. In my case I create a log in the $CATALINA_HOME/logs directory named after the app and do standard revolving logfiles. I also set the default logging level here. The nice thing about the logging api is that it is hierarchical and so once you have configured the root logger, additional loggers (one per class in my case) can be set as children to the root. All the children will use the properties of the root (like the log file you defined) as well as have their own properties which you can adjust to suit your debugging situation. Using this approach allows you to set the debugging level of a class higher if you are working on it and it leaves the other classes in a 'quiet' mode. One of the things I really like about the java logging API is that it allows you to change the loggin level at runtime. In my application I will be adding a management interface that will allow changing the debug level of a specific class on a deployed application at runtime. Jason On Tue, 6 Apr 2004, Farrell, Patrick wrote: I would like to pre-configure a web application to automatically create a logger with certain settings when the application is deployed to Tomcat 4.1.X. Is there a tomcat-specific configuration file that I can add to the WAR in order to accomplish this, or is editing the server.xml the only way to create a logger? If it is not possible to accomplish this task via a configuration file, could it be done using a startup servlet in the application? This class would have to use the Tomcat API directly in order to create a logger .. but it seems possible. Has anyone tried this before? Thanks in advance, Patrick M. Farrell Client Care Manager Client Server Web Development Quick Solutions, Inc. A four time INC 500 winner! [EMAIL PROTECTED] *** This message is intended only for the use of the intended recipient and may contain information that is PRIVILEGED and/or CONFIDENTIAL. If you are not the intended recipient, you are hereby notified that any use, dissemination, disclosure or copying of this communication is strictly prohibited. If you have received this communication in error, please destroy all copies of this message and its attachments and notify us immediately. *** - 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]
Servlet Context Listener problem
I am using tomcat 5.0.19 and am experiencing different behavior from a servlet context listener than what is outlined in the servlet spec. My expectation is that the listener methods contextInitialized() and contextDestroyed() should be called respectively each time the application is undeployed and redeployed. However, in practice it appears the methods are only called once per tomcat session. I have a class that implements Servlet context listener and the methods contextInitialized() and contextDestroyed() are only called once and not on subsequent undeploys and redeploys. However, restarting tomcat causes the methods to be called again, but only for a single deployment of the application. Those methods are not called again unless tomcat is restarted (I have also tried the reload task, start and stop all with no success). That is, if the application is deployed and tomcat is restarted, the method contextInitialized() is called, and if the app is undelpoyed the method contextDestroyed() is also correctly called. On any subsequent deployments or undeployments the servlet context listener methods are not called. Restarting tomcat always results in the methods being called again on the first deployment or undeployment after the restart. First, is the witnessed behavior the way context listeners are supposed behave? If not, do you have any suggestions on where I might look to correct the problem. For completeness, I am including my listener tag from web.xml file and the source of the class that implements ServletContextListener. In my web.xml file I have registered the listener as follows: listener listener class scs.reaction.common.init.ReactionInitialization /listener-class /listener And here is my implementation: package scs.reaction.common.init; import java.io.IOException; import java.util.logging.*; import javax.servlet.*; public class ReactionInitialization implements ServletContextListener { Logger logger = null; public ReactionInitialization(){} public void contextInitialized(ServletContextEvent arg0){ // Check to see if the root log manager for this application exists if // not initialize it and set its default atributes if(LogManager.getLogManager().getLogger(scs.reaction)== null) { //Call the supers initialization first // we will name all loggers after thier fully qaulified class name logger = Logger.getLogger(scs.reaction); FileHandler fileHandler = null; //creare our own file handler // the file handler will cycle through 2 files // files are limited in size to 100KB and sessions are appended try { fileHandler = new FileHandler(System.getProperty(catalina.home)+ /logs/ + scs.reaction.log,100,2,true); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // use a standard text formatter for the file output fileHandler.setFormatter(new SimpleFormatter()); //attach the handler logger.addHandler(fileHandler); //Set the level to all messages logger.setLevel(Level.FINEST); logger.finer(Context Intitalized); } } public void contextDestroyed(ServletContextEvent arg0) { logger.finer(Context Destroyed); } } - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
RE: Servlet Context Listener problem - Solved
Yoav, Thanks for the quick response- Found my error, and embarrassingly it was a simple logic problem. My logger was only being initialized if it had not been previously initialized by the JVM. As such, within that logic block the log messages were only being output the very first time the app started in a tomcat session. So, it appeared that the listener wasn't being called, but in actuality it was doing exactly as it should. Jason Jason A. Bucholtz [EMAIL PROTECTED] SCS Computer Center 152 Noyes Lab 4-0560 On Mon, 5 Apr 2004, Shapira, Yoav wrote: Hi, A couple of quick notes as I have to run to a meeting: - I think your understanding of the spec is correct - What happens if you reload the app (not undeploy and redeploy, but reload) via the manager webapp? - Are you sure the undeploy is COMPLETELY done cleanly, and no threads from your own webapp are left behind? For example, do you have to shutdown your log manager? Yoav Shapira Millennium Research Informatics -Original Message- From: Jason Bucholtz [mailto:[EMAIL PROTECTED] Sent: Monday, April 05, 2004 3:04 PM To: Tomcat Users List Subject: Servlet Context Listener problem I am using tomcat 5.0.19 and am experiencing different behavior from a servlet context listener than what is outlined in the servlet spec. My expectation is that the listener methods contextInitialized() and contextDestroyed() should be called respectively each time the application is undeployed and redeployed. However, in practice it appears the methods are only called once per tomcat session. I have a class that implements Servlet context listener and the methods contextInitialized() and contextDestroyed() are only called once and not on subsequent undeploys and redeploys. However, restarting tomcat causes the methods to be called again, but only for a single deployment of the application. Those methods are not called again unless tomcat is restarted (I have also tried the reload task, start and stop all with no success). That is, if the application is deployed and tomcat is restarted, the method contextInitialized() is called, and if the app is undelpoyed the method contextDestroyed() is also correctly called. On any subsequent deployments or undeployments the servlet context listener methods are not called. Restarting tomcat always results in the methods being called again on the first deployment or undeployment after the restart. First, is the witnessed behavior the way context listeners are supposed behave? If not, do you have any suggestions on where I might look to correct the problem. For completeness, I am including my listener tag from web.xml file and the source of the class that implements ServletContextListener. In my web.xml file I have registered the listener as follows: listener listener class scs.reaction.common.init.ReactionInitialization /listener-class /listener And here is my implementation: package scs.reaction.common.init; import java.io.IOException; import java.util.logging.*; import javax.servlet.*; public class ReactionInitialization implements ServletContextListener { Logger logger = null; public ReactionInitialization(){} public void contextInitialized(ServletContextEvent arg0){ // Check to see if the root log manager for this application exists if // not initialize it and set its default atributes if(LogManager.getLogManager().getLogger(scs.reaction)== null) { //Call the supers initialization first // we will name all loggers after thier fully qaulified class name logger = Logger.getLogger(scs.reaction); FileHandler fileHandler = null; //creare our own file handler // the file handler will cycle through 2 files // files are limited in size to 100KB and sessions are appended try { fileHandler = new FileHandler(System.getProperty(catalina.home)+ /logs/ + scs.reaction.log,100,2,true); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // use a standard text formatter for the file output fileHandler.setFormatter(new SimpleFormatter()); //attach the handler logger.addHandler(fileHandler); //Set the level to all messages logger.setLevel(Level.FINEST); logger.finer(Context Intitalized); } } public void contextDestroyed(ServletContextEvent arg0