log 4 jのNDCとMDC


ここ数日、暇になってロゴ4 jを振り返ると、PatternLayoutの各文字の意味を見ていると、この2つが見えてきました
x 	Used to output the NDC (nested diagnostic context) associated with the thread that generated the logging event. 
 
X 	

Used to output the MDC (mapped diagnostic context) associated with the thread that generated the logging event. The X conversion character must be followed by the key for the map placed between braces, as in %X{clientNumber} where clientNumber is the key. The value in the MDC corresponding to the key will be output.

See MDC class for more details. 
 
何がNDCを叫ぶことを知らないで、何がMDCを叫んで、googleの、発见しますhttp://www.ibm.com/developerworks/cn/web/wa-lo-usertrack/
 
 
と書く
NDC(Nested Diagnostic Context)は、Neil Harrisonが『Patterns for Logging Diagnostic Messages』という本で提案したネスト診断環境のメカニズムである.このメカニズムの提案は,主にマルチスレッドのシステムが顧客ごとにログを個別に記録するシステムオーバーヘッドを低減するためである.従来、2つのクライアントのログ出力を区別する一般的な方法は、クライアントごとに新しいカテゴリを個別にインスタンス化することでしたが、カテゴリ数を増やし、ログ記録の管理オーバーヘッドを増加させます.Neil Harrisonが提案した方法は,ユーザのコンテキスト情報をネスト診断環境(NDC)に入れることである.
NDCはスレッドごとにスタックを管理します.開発者は、スタックを維持するために、コード内の適切な位置に簡単なpushメソッドとpopメソッドを埋め込むことができます.通常、pushスタックには、SessionIDや顧客名、IPアドレスなど、顧客を一意に示すコンテキスト情報が存在する.クライアント要求ごとにNDCスタックが個別に存在するため、ログシステムは出力時に各スレッドに基づいて対応するスタックを見つけ、ログを出力する際にスタック内の情報を付加する.開発者は、さまざまなお客様が生成したログ・エントリをログで簡単に区別できます.
簡単に言えば、一意の識別ごとに情報を定義し、ログに出力することができます.
 
MDCはNDCと似ています.唯一の違いは、MDCの各スタック値がmapであることです.ログ出力で、自分が出力したい情報を定義することができます.
            MDC.put("first", "1111");
            MDC.put("second", "222");

log 4 j構成:
-4r [%t] %-5p %c %x [%X{first}] - %m%n

firstをkeyとする情報を出力ことができる.
 
 
ソースコードを見ると、NDCはhashtableを使用して各スレッドのスタックを維持しており、性能上少し損失している.