I have a couple of thoughts for you, but both violate at least one restriction you 
placed on the solution!  The ideas may lead you to something better than you currently 
have though.

1)  Use "Template Method" pattern.

You mentioned not wanting to change code, and this solution does require that.  Yet I 
suggest it as an alternative (an inverse) to the other suggestion to pass in the 
child's logger to the parent method.  This approach enables gradual implementation as 
the parent's methods signatures do not change (which obviously would cause an 
immediate change to all callers of a method).

For example, in the parent class, create a method:
  protected Logger getChildLogger()
  {
        return LOG;
  }

By default, it returns its own logger.  Have the subclasses override that method to 
return their own logger.

Then, in the parent class' methods you want to log to the child's logger, call that 
method to get it first.  Until a subclass overrides that method, there is no change 
from current behavior.

When you get to the point of having all subclasses override the getChildLogger() 
method, then make the one in the parent class abstract to guarantee each subclass 
having an implementation.


2)  Use a "TRACE" like behavior.  At the beginning of each method, log this:
  LOG.debug("methodName: begin")

and at the end of each method, log this:
  LOG.debug("methodName: end")

Then you will know that all log calls in between those two messages for a given user 
[solve with NDCing the user name] were as a result of executing that method.  This of 
course requires the parent class' messages turned on, which also violates something 
you said you did not want - too many from it!


> -----Original Message-----
> From: Scott Melcher [mailto:[EMAIL PROTECTED]
> Sent: Thursday, December 11, 2003 9:47 AM
> To: 'Log4J Users List'
> Subject: Log based on object and not the class
> 
> 
> Hi, my problem is that in my object architecture/hierarchy I 
> have dozens of
> classes that extend a single parent class.  The parent class 
> has a method
> that is called by all of the child classes.  It is in this 
> method that I
> have several log statements.  The problem is that I only have 
> the ability to
> turn the logger on or off for that parent class.  If I turn 
> it on then I
> will get too many logging messages.  I would only like to log 
> messages in
> that parent class for a given child class.
> I know I am not explaing this well so I will add a quick code example.
> 
> In my example I only want to log messages from the Child1 
> class.  Therefore
> if I was to execute my two child classes I would want to get a single
> "logging message".
> 
> Class Parent {
>       ...
>       Public void myMethod() {
>               Logger.debug("logging message");
>       }
> }
> 
> Class Child1 extends Parent {
>       ...
>       Public void execute1() {
>               this.myMethod();
>       }
> }
> 
> Class Child2 extends Parent {
>       ...
>       Public void execute2() {
>               this.myMethod();
>       }
> }
> 
> THANKS for any input you can give!
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to