On Dec 17, 2004, at 10:59 AM, Ben Arnold wrote:

Hi,

I have a (hopefully) simple question about getting context information into
my logging.


Say I have a class Agent:

class Agent {
public:
  long id() const { return myId_; }
  void doSomething();

private:
  static LoggerPtr agentLogger_;
};

This agent is connected to by a number of IP clients, and there are a number
of agents in the system (each with their own ID)


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()));

and then use an %X{agent} specification in your layout.




So rather than...
agentLogger->info( "Agent " + id() + " processing request" );
(please assume that there is a nice way to concatenate a log4cxx string with
a long, that's merely for ease of reading)

In the current CVS and the forthcoming 0.9.8, you might want to consider the stream-like interface provided in log4cxx/stream.h. The code would be like:


//
//   not thread safe, so it should not be static
//   typically created at entry to methods that use it
logstream agentStream(agentLogger, Level::INFO);

agentStream << Level::INFO << "Agent " << id() << " processing request" << LOG4CXX_ENDMSG;


0.9.7 and previous allowed "insertion fragments" to appear in the macros, but that is no longer supported:


LOG4CXX_INFO(agentLogger, "Agent " << id() << "processing request");



Reply via email to