This is a non-issue. If you need to log an object's type, call getClass().getName() and log it as a normal message. Stick to one private static logger in each class. The logger name will represent where the logging statement occurred, not the run time type of the logging object.
On Tue, Jan 27, 2009 at 8:54 AM, Douglas E Wegscheid <[email protected]> wrote: > if you want parameterized messages, use slf4j ;) > > -- > > Thread.currentThread() isn't there until Java 5 (though new Throwable > ().getStackTrace() works fine on 1.4.2). > > a more serious problem: it doesn't work if you call getLogger() from a > method in a superclass, then instantiate a subclass of that superclass and > do not override the method with the getLogger() class. The stack trace > will show the superclass. > > -- FakeLogger.java -- > > package org.wegscheid.traceback; > > public class FakeLogger { > public static FakeLogger getFakeLogger() { > StackTraceElement[] stack = Thread.currentThread().getStackTrace(); > //stack = new Throwable().getStackTrace(); > for (int i = 0; i < stack.length; i++) { > if (stack[i].getClassName().endsWith("FakeLogger")) { > return new FakeLogger(stack[i+1].getClassName()); > } > } > return null; > } > > String loggerName = null; > public FakeLogger (String s) { > super(); > loggerName = s; > } > public String toString () { > return "FakeLogger:" + loggerName; > } > public void log(String s) { > System.out.println(toString() + ": " + s); > } > } > > -- SuperClass.java -- > > package org.wegscheid.traceback; > > public class SuperClass { > public static void main (String[] args) { > SuperClass t1 = new SuperClass(); > SuperClass.staticWhatClassAmI(); > t1.whatClassAmI(); > System.out.println ("these should be from SubClass..."); > SuperClass t2 = new SubClass(); > SubClass.staticWhatClassAmI(); > t2.whatClassAmI(); > System.out.println ("these should be from SuperClass..."); > SuperClass.staticWhatClassAmI(); > t1.whatClassAmI(); > } > > static FakeLogger fakeLogger = FakeLogger.getFakeLogger(); > static void staticWhatClassAmI() { > fakeLogger.log("invoked from static method"); > } > > void whatClassAmI() { > fakeLogger.log("invoked"); > } > > static class SubClass extends SuperClass { > } > > } > > -- output from SuperClass.main() -- > > FakeLogger:org.wegscheid.traceback.SuperClass: invoked from static method > FakeLogger:org.wegscheid.traceback.SuperClass: invoked > these should be from SubClass... > FakeLogger:org.wegscheid.traceback.SuperClass: invoked from static method > FakeLogger:org.wegscheid.traceback.SuperClass: invoked > these should be from SuperClass... > FakeLogger:org.wegscheid.traceback.SuperClass: invoked from static method > FakeLogger:org.wegscheid.traceback.SuperClass: invoked > > -- > > you can fix this by extra code in the subclass, but it's an easy thing to > forget to do: > > package org.wegscheid.traceback; > > public class SuperClassFixed { > public static void main (String[] args) { > SuperClassFixed t1 = new SuperClassFixed(); > SuperClassFixed.staticWhatClassAmI(); > t1.whatClassAmI(); > System.out.println ("these should be from SubClass..."); > SuperClassFixed t2 = new SubClassFixed(); > SubClassFixed.staticWhatClassAmI(); > t2.whatClassAmI(); > System.out.println ("these should be from SuperClass..."); > SuperClassFixed.staticWhatClassAmI(); > t1.whatClassAmI(); > } > > static FakeLogger fakeLogger = FakeLogger.getFakeLogger(); > > static void staticWhatClassAmI() { > fakeLogger.log("invoked from static method"); > } > > void whatClassAmI() { > fakeLogger.log("invoked"); > } > > static class SubClassFixed extends SuperClassFixed { > static { > fakeLogger = FakeLogger.getFakeLogger(SubClassFixed.class); > } > } > > } > > -- output from SuperClassFixed.main() -- > > FakeLogger:org.wegscheid.traceback.SuperClassFixed: invoked from static > method > FakeLogger:org.wegscheid.traceback.SuperClassFixed: invoked > these should be from SubClass... > FakeLogger:org.wegscheid.traceback.SuperClassFixed$SubClassFixed: invoked > from static method > FakeLogger:org.wegscheid.traceback.SuperClassFixed$SubClassFixed: invoked > these should be from SuperClass... > FakeLogger:org.wegscheid.traceback.SuperClassFixed$SubClassFixed: invoked > from static method > FakeLogger:org.wegscheid.traceback.SuperClassFixed$SubClassFixed: invoked > > -- > > but now the 2nd set of logging calls for t1 are showing the wrong class... > > > > if you set the logger in the subclass, you screw up the superclass' > logger (static class variables are shared with subclasses, yes?). static > loggers in a subclass/superclass situation are messy, I haven't been able > to figure out a good way to do static loggers in that siutation. Any > ideas? > > Douglas E Wegscheid > Lead Technical Analyst, Whirlpool Corporation > (269)-923-5278 > > "A wrong note played hesitatingly is a wrong note. A wrong note played > with conviction is interpretation." > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
