Re: Creating Loggers at Deployment Time

2004-04-06 Thread Jason Bucholtz
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

2004-04-05 Thread Jason Bucholtz
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

2004-04-05 Thread Jason Bucholtz
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