• Showing Page History #78574

NDCとは

NDCはnested diagnostic contextsの略で、日本語にすると「ネスト化診断コンテキスト」となります。

どういう物かを説明するより、どんなときに、何のために使うのかを説明した方が分かりやすいと思いますから、 その方針で説明してきます。

どんなときに:

主に、Tomcatのようなサーバサイドのプログラムで、スレッドをプールし、使いまわす。クライアントから要求が来たらプールしていたスレッドを使い、クライアントからの要求を処理する。

何のために使うのか:

ログを出力するときに、どのクライアントからの要求だったのかが分かるようにしたい。

ログ出力にスレッドIDやスレッド名を出力すれば?

ダメなんです。スレッドIDはプログラムを実行するたびに変わるので、訳が分からなくなります。 スレッド名は、この例ではスレッドをプールしていて、使いまわしているのでダメなんです。

そこでNDCを使います。

クライアントから要求が来たら、 NDC.pushを呼んで、クライアントのIDや名前を入れてあげれば良いです。処理が終わったら、NDC.clearを呼べば良いです。 ちなみに、NDC.pushやNDC.clearはstaticメンバですが、データはグローバル領域に保持されるのではなく、 スレッド固有のデータ(TLS:Thread local storage)に保持されるものです。 なので、他のスレッドのNDCには影響しません。

参考資料

APIドキュメント内でのNDCの説明

Log4J徹底解説~使い方(1)

Log4j Q&Aの中の「Q3:特定のクライアントのログの追跡を行うには?」