#include <NDC.hh>
Classes | |
struct | DiagnosticContext |
Public Types | |
typedef std::vector< DiagnosticContext > | ContextStack |
Public Member Functions | |
virtual void | _clear () |
virtual ContextStack * | _cloneStack () |
virtual const std::string & | _get () const |
virtual size_t | _getDepth () const |
virtual void | _inherit (ContextStack *stack) |
virtual std::string | _pop () |
virtual void | _push (const std::string &message) |
virtual void | _setMaxDepth (int maxDepth) |
NDC () | |
virtual | ~NDC () |
Static Public Member Functions | |
static void | clear () |
static ContextStack * | cloneStack () |
static const std::string & | get () |
static size_t | getDepth () |
static NDC & | getNDC () |
static void | inherit (ContextStack *stack) |
static std::string | pop () |
static void | push (const std::string &message) |
static void | setMaxDepth (int maxDepth) |
Public Attributes | |
ContextStack | _stack |
Static Private Attributes | |
static const std::string | emptyString = "" |
static bool | isUsedNDC = false |
The NDC class implements nested diagnostic contexts as defined by Neil Harrison in the article "Patterns for Logging Diagnostic Messages" part of the book "<i>Pattern Languages of Program Design 3</i>" edited by Martin et al.
A Nested Diagnostic Context, or NDC in short, is an instrument to distinguish interleaved log output from different sources. Log output is typically interleaved when a server handles multiple clients near-simulatanously.
Interleaved log output can still be meaningful if each log entry from different contexts had a distinctive stamp. This is where NDCs come into play.
Note that NDCs are managed on a per thread basis. NDC operations such as push
, pop
, clear
, getDepth
and setMaxDepth
affect the NDC of the current thread only. NDCs of other threads remain unaffected.
To build an NDC one uses the push
operation. Simply put,
Contexts can be nested.
When entering a context, call NDC.push
. As a side effect, if there is no nested diagnostic context for the current thread, this method will create it.
NDC.pop
. There is no penalty for forgetting to match each push
operation with a corresponding pop
, except the obvious mismatch between the real application context and the context set in the NDC.
Custom Layouts may include the nested diagnostic context for the current thread in log messages, without any user intervention. Hence, even if a server is serving multiple clients simultaneously, the logs emanating from the same code (belonging to the same category) can still be distinguished because each client request will have a different NDC tag.
Unfortunately, unlike Java, C++ does not have platform independent multithreading support. Therefore, currently log4cpp is not multithread aware, it implicitly assumes only one thread exists, the main process thread.
typedef std::vector<DiagnosticContext> log4cpp::NDC::ContextStack |
|
virtual |
|
virtual |
|
virtual |
|
static |
Clear any nested disgnostic information if any. This method is useful in cases where the same thread can be potentially used over and over in different unrelated contexts.
This method is equivalent to calling the setMaxDepth
method with a zero maxDepth
argument.
|
static |
Clone the diagnostic context for the current thread.
Internally a diagnostic context is represented as a stack. A given thread can supply the stack (i.e. diagnostic context) to a child thread so that the child can inherit the parent thread's diagnostic context.
The child thread uses the inherit
method to inherit the parent's diagnostic context.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
ContextStack log4cpp::NDC::_stack |
|
staticprivate |
|
staticprivate |