Ditch the super class philosphy. And copy the following 3 lines of code: import ... LogFactory; import ... Log; private static log = LogFactory.get...(My.class);
You don't want to use the super class philophy because debugging the inheritance chain becomes impossible. For example:
SuperClass
SubClass
SubSubClass
SubSubSubClass
With a log variable at the Super class level inherited by the sub classes, it is IMPOSSIBLE to debug SubClass or SubSubClass. (As well as SuperClass) For example - I might want trace turned on for the super class and warn on for the rest of the classes in the hierarchy. Inheritance kills any chance of fine grained control of log output.
If it's static - it can't be transient. And all the instances share all the same log instance at the Classloader level so it is never serialized.
-Tim
Spiegs wrote:
What is the best approach for someone starting a new app? Is having all of your model objects contain a transient static log instance, implement Serializable, and implement HttpSessionActivationListener to reinstantiate the log instance the best approach? What other approaches would you recommend if you were to start with a clean slate?
If you were to put the above code into a superclass, doesn't that go against the previously discussed advice of having the log instance belong to each class?
Thanks, Eric
-------- Original Message ------ Subject: Re: Serializable Logging implementation From: Tim Funk <[EMAIL PROTECTED]> Date: Wed, 15 Sep 2004 09:20:06 -0400
To: Tomcat Users List <[EMAIL PROTECTED]>
Your NPE comes from the transient value not being restored from de-serialization.
Your best chance at this point without a lot of code changes is to 1) Make your log variable transient 2) Make your base class implement HttpSessionActivationListener. 3) Make your implementation of sessionDidActivate():
public void sessionDidActivate(HttpSessionEvent se) { if (log==null) log = LogFactory.getLog(this.getClass()); }
public void sessionWillPassivate (HttpSessionEvent se) { ; /* Nothing to do */ }
-Tim
Antony Paul wrote:
Then it throws NullPointerException
rgds Antony Paul
----- Original Message ----- From: "Shapira, Yoav" <[EMAIL PROTECTED]> To: "Tomcat Users List" <[EMAIL PROTECTED]> Sent: Wednesday, September 15, 2004 6:05 PM Subject: RE: Serializable Logging implementation
Hi, Hmm, you want to be careful with this pattern. I like the private static one for Loggers -- there are very good reasons it's the recommended pattern (by log4j, by the java.util.logging folks) and the one that's used (by Tomcat and most other serious apps I know of).
If you really want to stick with your "base class gets the logger" pattern, consider marking it as transient.
Yoav Shapira Millennium Research Informatics
-----Original Message----- From: Antony Paul [mailto:[EMAIL PROTECTED] Sent: Wednesday, September 15, 2004 8:27 AM To: Tomcat Users List Subject: Re: Serializable Logging implementation
I extend a base form which gets the Log as LogFactory.getLog(this.getClass()); So that no need to define and get a Log instance in subclass. Is there
any
way so that I can follow this pattern.
rgds Antony Paul
----- Original Message ----- From: "Tim Funk" <[EMAIL PROTECTED]> To: "Tomcat Users List" <[EMAIL PROTECTED]> Sent: Wednesday, September 15, 2004 4:38 PM Subject: Re: Serializable Logging implementation
logging instances should be static to the class.
// Commons logging example but a log4j equiv should be easy to find private static Log log = LogFactory.getLog(MyClass.class);
-Tim
Antony Paul wrote:
Hi, I used Log4J and commons logging in an ActionForm which is
stored
in the
session. When I reload the context it is invalidating the session
because it
is non serializable. Is there any work around for this ?. Or do I
have
to
use any other Logger.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]