On Mar 25, 2008, at 10:02 AM, James A. N. Stauffer wrote:
I think log4j has some support for 3rd party loggers so it can do the
work of determining the calling class but I don't remember the
details. If Common.status updates the GUI I would level all calls to
it the same. Then it is up to you to change all calls to Common.debug
to Logger.debug depending on how much work that would be.
On Tue, Mar 25, 2008 at 8:08 AM, Clinton Weiss
<[EMAIL PROTECTED]> wrote:
I'm seeking some advice here. I have a legacy application with
it's own
built in logging system accessed via Common.status(String) and
Common.debug(String). The status method is used to update the
application
GUI's status line so the user has some idea of what is going on, it
also
emits the String to System.out. The debug message just emits the
String to
System.out.
Now, I'd like to replace this setup with log4j, however, the
pitfall is how
do I still let the user know what is going on? I believe I have a
couple of
choices here:
1) Import log4j only in the Common class, and still allow all code
to call
the status() and debug(). When status or debug are called, it will
inspect
the current thread to see which class to pass to the logger and
create (or
use a mapped) logger accordingly. This would probably be the
easiest, but
not the correct way of doing it.
Do you really have a requirement to use named loggers? It would be
much simpler and efficient to just use the root logger or fixed logger
names ("com.example.MyApp.status" and "com.example.MyApp.debug").
log4j can determine the calling class name if you use a little
trickery. If you just called Logger.debug(), a "%C" would output the
name of the class that made the call to Logger.debug which would be
something like com.example.Common. You could use Logger.forcedLog
which takes a fully qualified class name which is used to determine
the boundary between the application and the logging framework.
However, that method is declared protected so you have to extend
Logger. However, that method can be replicated by two public methods,
so you could do something like:
package com.example;
public class Common {
private static Logger root = Logger.getRootLogger();
void status(final String msg) {
if (root.isInfoEnabled()) {
root.callAppenders(new
org.apache.log4j.spi.LoggingEvent("com.example.Common", root,
Level.INFO, msg, null));
}
//
// update status line
//
}
}
2) Replace all Common.status(String) and Common.debug(String) calls
with
logger.info(String) and logger.debug(String). However, can I
create a class
that will listen for logger.info(String) calls and then can update
the GUI's
status accordingly? This, I presume, would be the correct way of
doing it -
if it is at all possible.
It is probably not good to mix UI concerns like the status line and
logging. For example, you may want to turn off the log file without
affecting the frequency of updates of the status line. Or up the
number of active logged statements without increasing the number of
status line updates.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]