[[PageNavi(NavigationList)]] === 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の説明 http://log4cpp-jp.sourceforge.jp/api/classlog4cpp_1_1NDC.html Log4J徹底解説~使い方(1) http://www.nurs.or.jp/~sug/soft/log4j/log4j2.htm Log4j Q&Aの中の「Q3:特定のクライアントのログの追跡を行うには?」 http://www.oki-osk.jp/esc/log4j/web/A3.html [[PageNavi(NavigationList)]]