Show page source of NDC #78574

[[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)]]