>>> I can use NDC to log the IP of the connecting client for all my
>>> logging within the doSomething function, which is good.  However I
>>> would also like to include the agent's ID implicitly without having
>>> to include it in each call to .info() or .debug() etc.
>> 
>> You could use MDC to hold the agent ID (it could also hold the IP).
>> 
>> MDC::set("IP", ip);
>> MDC::set("agent", itoa(id()));
> 
>   Isn't the MDC thread-specific like the NDC?  I want to be
> able to have multiple threads producing the same agent
> context automatically (though the IP would be different for each
> thread.) 

I've had a read through the Apress "Logging in Java with JDK 1.4 Logging API
and Apache log4j" and found a sample "advanced" logging application that
pushes context onto the NDC/MDC upon entry to each method and pops it back
off just before exiting, i.e.

public void deposit(double amount) {
  NDC.push(userName);
  balance += amount;
  logger.info("Deposited "+amount+" new balance: "+balance);
  NDC.pop();
}

This seems a bit ungainly to me (even if it were wrapped in a RAII idiom) and
I would also question the efficiency of it, especially when the context may
be more complicated that a single variable.  Does anyone think that this is a
good way of having object-level context?

Thanks,
Ben

Reply via email to