tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tim Funk <funk...@joedog.org>
Subject Re: Serializable Logging implementation
Date Fri, 17 Sep 2004 01:05:41 GMT
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 <funkman@joedog.org>
> Date:
> Wed, 15 Sep 2004 09:20:06 -0400
> 
> To:
> Tomcat Users List <tomcat-user@jakarta.apache.org>
> 
> 
> 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" <Yoav.Shapira@mpi.com>
>> To: "Tomcat Users List" <tomcat-user@jakarta.apache.org>
>> 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:antonypaul24@hotmail.com]
>>> 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" <funkman@joedog.org>
>>> To: "Tomcat Users List" <tomcat-user@jakarta.apache.org>
>>> 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: tomcat-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-user-help@jakarta.apache.org


Mime
View raw message