I've liked the log4j Logger except for two things. The first is that I have to pass my class name to the logger when I get it, for example:
private static Logger myLogger = Logger.getLogger(MyClass.class); This is fine but it is prone to cut and paste errors. A better solution is to add the following getLogger method to Logger: static public Logger getLogger() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); int I; for (I = 0; I < stack.length; I++) { if (stack[I].getClassName().equals("org.apache.log4j.Logger")) { break; } } return (getLogger(stack[I+1].getClassName())); } This will use the stack to see what class it is inside of. Now all of my classes can have the following: private static Logger myLogger = Logger.getLogger(); No cut and paste errors. The other issue with log4j is with building parametrized debug messages. The documentation explains, correctly, that I should not do the following: myLogger.debug("This is my debug value "+myObject); This causes a StringBuffer to be built even though the call does not do anything when I'm not logging debug events. A simple solution would be to have a parametrized debug method such as public void debug(String msg, Object... params); The implementation doesn't have to be fancy, maybe something similar to MessageFormat. This would let me pass the following: myLogger.debug("This is my debug value {0}", myObject); Now nothing is processed unless I'm logging debug events. Thanks Brian