On Fri, 19 Oct 2001, Arnaud Héritier wrote:
> Date: Fri, 19 Oct 2001 10:55:49 +0200
> From: Arnaud Héritier <[EMAIL PROTECTED]>
> Reply-To: [EMAIL PROTECTED],
> "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
> To: "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
> Subject: RE: Logging from a servlet in Tomcat
>
> One question about this subject. Why the Tomcat (4) team (Craig and
> others) didn't use log4J to trace the server ?????
>
Using Log4J for Tomcat internally is on the TODO list, but has never been
high enough on anyone's priority list to get around to. Of course, there
is absolutely nothing that stops webapps from using Log4J for themselves.
For Tomcat 4 to use Log4J itself, there would be two possible
implementation approaches:
* (Easy) - Write a Logger implementation that writes to Log4J
underneath. This would be pretty trivial, but wouldn't really
give the fine-grained control over what output actually gets
written that is the reason to use Log4J in the first place.
* (Harder) - Rip out all the Logger stuff and replace it with
corresponding Log4J calls. Besides breaking backwards compatibility,
there are a couple of gotchas with this approach:
- Log4J's "category" model does not really match very well
with Tomcat 4's internal architecture of components, and
in particular the ability to "inherit" a parent's Logger.
Ceki Gulcu (author of Log4J) has suggested a couple of
approaches, but they aren't as elegant as I would prefer.
- There is an amount-of-typing hit (sorry, gotta be a little
selfish once in a while :-) and a potential performance
hit for doing this switch.
Tomcat's internal code has lots of this kind of thing:
if (debug >= 2)
logger.log("Started the " + name + " application");
where you use String concatenation to build the message. Because of the
way Java works, the string concatenation will *only* be done if debug is
actually >= 2, so you don't pay the performance cost unless you're
actually going to do the logging.
The typical Log4J pattern for this would be something like:
category.debug("Started the " + name + " application");
which would let the logger implementation decide whether or not to
actually do the output, based on your Log4J configuration settings.
However, you pay the cost of doing the string concatination no matter
what - and that's a waste of effort if you aren't actually going to write
the message out.
The better solution is something like (forgive me if I don't get the
syntax exactly right -- I don't have the APIs in front of me):
if (category.isDebugEnabled())
category.debug("Started the " + name + " application");
which is much wordier, and sort of redundant. And you don't have the
conditional checks for all the possible levels (or at least you didn't
use to - this might have changed), so you might not be able to apply this
optimization even if you're willing to type all the extra characters.
Craig