Discussion:
logging with multiple web applications
Jamie
2008-06-17 13:08:40 UTC
Permalink
Hi Everyone

Does anyone know how to configure Tomcat such that logging writes to
separate log files for each web application? When we deploy several
instances of our web application, for some reason, the logging output
from all web applications is merged into a single debug.log file.
Apparently, Tomcat uses an extended the log4j package (JULI) to support
logging across multiple web applications, but we are unsure on how to
activate it. I have a feeling we may not be using the right
packages/configuration and would appreciate your guidance.

In our example, each web application has its own log4j.properties file
stored in WEB-INF/classes. The log4j.properties file specifies an
appender with the the location of the debug.log file as follows:

log4j.appender.archivadebug.File=${catalina.home}/logs/debug.log

Even if we specify a different file name for each web application, it
only seems to pickup the first one. It combines logging output from all
web applications into a single log file. Any ideas on why this might be
the same?

Throughout my web application code, I use the following:

import org.apache.log4j.Logger;
..
protected static final Logger logger = Logger.getLogger(Config.class);
..
logger.debug("this is a test log output");

The jar log4j-1.2.14.jar is bundled with the web application and is
located in WEB-INF/lib

How does one make it such that each web application will have its own
log file? For example, say I had the web applications webapp1, and
webapp2 - the debug log file for each could be debug-webapp1.log and
debug-webapp2.log, respectively. Do I need to
import catalina's version of log4j? What is the import line?

Many thanks in advance for your guidance

Jamie

PS: My log4.properties file located in WEB-INF/classes currently looks
like this:

# logging levels
log4j.logger.com.stimulus.archiva.audit=info,archivaaudit
log4j.logger.com.stimulus=DEBUG, archivadebug
#log4j.rootLogger=INFO,archivadebug
#log4j.logger.com.stimulus=warn, mail
#log4j.logger.org.apache.struts=INFO, tomcat
#log4j.logger.org.apache.struts.action=INFO, tomcat
#log4j.logger.org.apache=INFO, tomcat
#log4j.logger.org.apache.commons.digester.Digester= INFO, tomcat
#log4j.logger.org.subethamail.smtp=debug,archivadebug

# debug log
log4j.appender.archivadebug=org.apache.log4j.RollingFileAppender
log4j.appender.archivadebug.File=${catalina.home}/logs/debug.log
log4j.appender.archivadebug.MaxFileSize=200480KB
log4j.appender.archivadebug.layout=org.apache.log4j.PatternLayout
log4j.appender.archivadebug.layout.ConversionPattern=%5p %d{MMM/dd
HH:mm:ss} - %m%n
log4j.appender.archivaaudit.MaxBackupIndex=7

# audit log
log4j.appender.archivaaudit=org.apache.log4j.DailyRollingFileAppender
log4j.appender.archivaaudit.File=${catalina.home}/logs/audit.log
log4j.appender.archivaaudit.layout=org.apache.log4j.PatternLayout
log4j.appender.archivaaudit.layout.ConversionPattern=%5p %d{MMM/dd
HH:mm:ss} - %m%n
log4j.appender.archivaaudit.DatePattern=.yyyy-MM-dd
log4j.appender.archivaaudit.MaxBackupIndex=10000

# tomcat log
log4j.appender.tomcat=org.apache.log4j.RollingFileAppender
log4j.appender.tomcat.File=${catalina.home}/logs/tomcat.log
log4j.appender.tomcat.MaxFileSize=10000KB
log4j.appender.tomcat.layout=org.apache.log4j.PatternLayout
log4j.appender.tomcat.layout.ConversionPattern=%5p %d{MMM/dd HH:mm:ss} -
%m%n


---------------------------------------------------------------------
To start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
Caldarale, Charles R
2008-06-17 13:22:10 UTC
Permalink
Subject: logging with multiple web applications
Does anyone know how to configure Tomcat such that logging writes to
separate log files for each web application?
Care to tell anyone what version of Tomcat you're using?

- 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 start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
Jamie
2008-06-17 13:27:22 UTC
Permalink
That will be Tomcat version 6.0
Post by Caldarale, Charles R
Subject: logging with multiple web applications
Does anyone know how to configure Tomcat such that logging writes to
separate log files for each web application?
Care to tell anyone what version of Tomcat you're using?
- 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.
---------------------------------------------------------------------
--
Stimulus Software - MailArchiva
Email Archiving And Compliance
USA Tel: +1-713-366-8072 ext 3
UK Tel: +44-20-80991035 ext 3
Email: ***@stimulussoft.com
Web: http://www.mailarchiva.com




---------------------------------------------------------------------
To start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
André Warnier
2008-06-17 13:50:55 UTC
Permalink
Post by Jamie
That will be Tomcat version 6.0
Post by Caldarale, Charles R
Subject: logging with multiple web applications
Does anyone know how to configure Tomcat such that logging writes to
separate log files for each web application?
Care to tell anyone what version of Tomcat you're using?
Now Jamie, just a word of caution : this guy Chuck sounds like he's nice
and wants to help, but don't get your hopes up, cause the next time he
might just tell you to go read the log4j documentation..
;-)

Ok, cheap shot.
But just to say that I'm listening too, just in case the answer would
help me understand how it works, and reduce my daily Tomcat logs to
monthly ones.

André


---------------------------------------------------------------------
To start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
Caldarale, Charles R
2008-06-17 14:16:10 UTC
Permalink
Subject: Re: logging with multiple web applications
Now Jamie, just a word of caution : this guy Chuck sounds
like he's nice and wants to help, but don't get your hopes
up, cause the next time he might just tell you to go read
the log4j documentation..
Actually, the OP appears to have done that, unlike some...

The real question is, has the OP read this:
http://tomcat.apache.org/tomcat-6.0-doc/logging.html

(My guess is that actually has been done as well.) Note that most of the log4j section in the above applies to Tomcat internal logging, not individual webapp logging, except where noted.
Apparently, Tomcat uses an extended the log4j package (JULI)
to support logging across multiple web applications
No, JULI is not log4j; JULI is a more flexible replacement for the somewhat restrictive JDK logging mechanism. Internally, Tomcat uses commons-logging, but webapps are free to use whatever they please.
each web application has its own log4j.properties file
Look for any more global instances of log4j.properties (or log4j.xml) and get rid of them.
The jar log4j-1.2.14.jar is bundled with the web application
and is located in WEB-INF/lib
Verify that you don't have any instances of a log4j*.jar in Tomcat's lib directory and that you have no CLASSPATH environment variable set.
Do I need to import catalina's version of log4j?
No, especially since Tomcat doesn't use log4j, unless you modify it to do so.
log4j.appender.archivadebug.File=${catalina.home}/logs/debug.log
I'd suggest changing all config lines that refer to debug.log to something unique for each webapp.

Have you placed any jars in Tomcat's lib directory that are shared across webapps? If so, and if they are doing any logging, it will use the log4j config of the first webapp to get there. Better to deploy such libraries with each webapp rather than introduce such crosstalk.

- 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 start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
Jamie
2008-06-17 14:28:50 UTC
Permalink
Hi Charles

Thanks for the help. See below.
Post by Caldarale, Charles R
http://tomcat.apache.org/tomcat-6.0-doc/logging.html
(My guess is that actually has been done as well.) Note that most of the log4j section in the above applies to Tomcat internal logging, not individual webapp logging, except where noted.
Yes, I had actually read through that, but as you say, the discussion on
individual web application logging is limited.
Post by Caldarale, Charles R
No, JULI is not log4j; JULI is a more flexible replacement for the somewhat restrictive JDK logging mechanism. Internally, Tomcat uses commons-logging, but webapps are free to use whatever they please.
I already knew that.
Post by Caldarale, Charles R
Post by Jamie
each web application has its own log4j.properties file
Look for any more global instances of log4j.properties (or log4j.xml) and get rid of them.
Thanks. will do.
Post by Caldarale, Charles R
Post by Jamie
The jar log4j-1.2.14.jar is bundled with the web application
and is located in WEB-INF/lib
Verify that you don't have any instances of a log4j*.jar in Tomcat's lib directory and that you have no CLASSPATH environment variable set.
Ok. I currently have the log4j-1.2.14.jar file in the WEB-INF/lib
directory. I will remove it.
Post by Caldarale, Charles R
Post by Jamie
Do I need to import catalina's version of log4j?
No, especially since Tomcat doesn't use log4j, unless you modify it to do so.
What is the equivalent import statement to enable access to Catalina's
logger functionality?
Post by Caldarale, Charles R
Post by Jamie
log4j.appender.archivadebug.File=${catalina.home}/logs/debug.log
Will do.
Post by Caldarale, Charles R
I'd suggest changing all config lines that refer to debug.log to something unique for each webapp.
Have you placed any jars in Tomcat's lib directory that are shared across webapps? If so, and if they are doing any logging, it will use the log4j config of the first webapp to get there. Better to deploy such libraries with each webapp rather than introduce such crosstalk.
I do have shared JARs and class files across web apps. This is a
strongly desired feature as the intention is to minimize the memory
footprint of each web app. Is there a way to use shared libs/classes and
have the logging output separate?


---------------------------------------------------------------------
To start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
Caldarale, Charles R
2008-06-17 14:39:31 UTC
Permalink
Subject: Re: logging with multiple web applications
Ok. I currently have the log4j-1.2.14.jar file in the WEB-INF/lib
directory. I will remove it.
No, that's where it's supposed to be; one copy for each webapp. I was referring to Tomcat's lib directory, not each webapp's.
I do have shared JARs and class files across web apps.
That is most likely the source of your problem.
This is a strongly desired feature as the intention is to
minimize the memory footprint of each web app.
Unless you have many thousands of shared classes, your concern is probably unfounded. By introducing such run-time dependencies, you pretty much guarantee that you have to take the whole server down to update a single webapp, and created versioning hell when you need to update a shared library for one particular webapp but not the others. Memory is cheap; don't be afraid of configuring a larger PermGen when needed.
Is there a way to use shared libs/classes and
have the logging output separate?
Yes, but it's ugly: each caller of a method in a shared class must pass in a reference to the webapp's logger, rather than letting the shared class have its own. You really don't want to do that, since it complicates and obfuscates the interface. Just stop sharing your classes.

- 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 start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org
David Fisher
2008-06-17 17:44:06 UTC
Permalink
Hi Chuck,

These threads have clarified things for me as well. Thanks.
Post by Caldarale, Charles R
Subject: Re: logging with multiple web applications
Ok. I currently have the log4j-1.2.14.jar file in the WEB-INF/lib
directory. I will remove it.
No, that's where it's supposed to be; one copy for each webapp. I
was referring to Tomcat's lib directory, not each webapp's.
I do have shared JARs and class files across web apps.
That is most likely the source of your problem.
This is a strongly desired feature as the intention is to
minimize the memory footprint of each web app.
Unless you have many thousands of shared classes, your concern is
probably unfounded. By introducing such run-time dependencies, you
pretty much guarantee that you have to take the whole server down
to update a single webapp, and created versioning hell when you
need to update a shared library for one particular webapp but not
the others. Memory is cheap; don't be afraid of configuring a
larger PermGen when needed.
Yes, this where I am. Memory is not cheap when you are running old
hardware w/o option to replace and have your own webapps large area.
But you are correct about tomcat's reasonable approach to the
problem. I'll need to do containers as singletons. If a webapps is
too PermGen intensive with 4000 clases, etc. maybe it needs its own
isolation.
Post by Caldarale, Charles R
Is there a way to use shared libs/classes and
have the logging output separate?
Yes, but it's ugly: each caller of a method in a shared class must
pass in a reference to the webapp's logger, rather than letting the
shared class have its own. You really don't want to do that, since
it complicates and obfuscates the interface. Just stop sharing
your classes.
Once I put apache in front I can.

I'm not replying in the related classloader thread, but that is
helpful as well in thinking about going from 5.5.25 to 6.

As always - illuminating.

Regards,
Dave
Post by Caldarale, Charles R
- 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 start a new topic, e-mail: ***@tomcat.apache.org
To unsubscribe, e-mail: users-***@tomcat.apache.org
For additional commands, e-mail: users-***@tomcat.apache.org

Loading...