# Poco

# class NestedDiagnosticContext

Library: Foundation
Package: Core
Header: Poco/NestedDiagnosticContext.h

## Description

This class implements a Nested Diagnostic Context (NDC), as described in Neil Harrison's article "Patterns for Logging Diagnostic Messages" in "Pattern Languages of Program Design 3" (Addison-Wesley).

A NDC maintains a stack of context information, consisting of an informational string (e.g., a method name), as well as an optional source code line number and file name. NDCs are especially useful for tagging log messages with context information which is very helpful in a multithreaded server scenario. Every thread has its own private NDC, which is automatically created when needed and destroyed when the thread terminates.

The NDCScope (or NDC::Scope) class can be used to automatically push information at the beginning of a scope, and to pop it at the end. The poco_ndc(info) macro augments the information with a source code line number and file name.

## Member Summary

Member Functions: clear, current, depth, dump, operator =, pop, push, toString

## Types Aliases

### Scope

using Scope = NDCScope;

## Constructors

### NestedDiagnosticContext

NestedDiagnosticContext();

Creates the NestedDiagnosticContext.

### NestedDiagnosticContext

NestedDiagnosticContext(
const NestedDiagnosticContext & ctx
);

Copy constructor.

## Destructor

### ~NestedDiagnosticContext

~NestedDiagnosticContext();

Destroys the NestedDiagnosticContext.

## Member Functions

### clear

void clear();

Clears the NDC stack.

### current

static NestedDiagnosticContext & current();

Returns the current thread's NDC.

### depth

int depth() const;

Returns the depth (number of contexts) of the stack.

### dump

void dump(
std::ostream & ostr
) const;

Dumps the stack (including line number and filenames) to the given stream. The entries are delimited by a newline.

### dump

void dump(
std::ostream & ostr,
const std::string & delimiter,
bool nameOnly = false
) const;

Dumps the stack (including line number and filenames) to the given stream. If nameOnly is false (default), the whole path to file is printed, otherwise only the file name.

### operator =

NestedDiagnosticContext & operator = (
const NestedDiagnosticContext & ctx
);

Assignment operator.

### pop

void pop();

Pops the top-most context off the stack.

### push

void push(
const std::string & info
);

Pushes a context (without line number and filename) onto the stack.

### push

void push(
const std::string & info,
LineNumber line,
const char * filename
);

Pushes a context (including line number and filename) onto the stack. Filename must be a static string, such as the one produced by the __FILE__ preprocessor macro.

### toString

std::string toString() const;

Returns the stack as a string with entries delimited by colons. The string does not contain line numbers and filenames.