I would welcome your opinion on the proper use of the Nested Diagnostic Context (NDC)
when logging using log4j.
As you know in a multi-threaded servlet environment, the NDC provides valuable
contextual information to help make sense of otherwise hopelessly interleaved messages
in the log device. What is the correct procedure for setting up the NDC? It seems
like every log message must be sandwiched by a push() and a pop(). For example:
NDC.push("something");
log.debug("The message being logged");
NDC.pop();
What is the overhead of changing all log statements to this format? Especially
requiring consideration is the fact that the "something" that uniquely identifies a
context isn't always readily available and may require some computation to obtain.
For example, the unique identifier may be the userid which is (probably) stashed away
in the session, so the above three line segment is really:
NDC.push((String)session.getAttribute("user.key"));
log.debug("The message being logged");
NDC.pop();
This not only adds to the latency (?) it also necessitates the -- otherwise
unnecessary -- passing of the session object around. It also muddies logging in the
business layer that has no notion of sessions.
Further, can't a session's processing get preempted between the push() and the actual
logging resulting in something like:
John: The message being logged
null: The message being logged
Or am I missing something?
Your thoughts?
Sri