スポンサー広告 - スポンサーサイト

--/--/-- (--) --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【プログラミング】JAVA - log4jのNDCとMDC

2010/11/28 (日) 21:04

NDCとは「Nested Diagnostic Context」の略。
org.apache.log4j.NDC クラスを使う。

NDC.push("hoge1");
とかすると、ログ出力レイアウト上の「%x」が置き換わる。
スタックするので、さらに
NDC.push("hoge2");
とかすると、「%x」は「hoge1 hoge2」になる。
この状態で
NDC.pop();
すると、末尾のデータが無くなり「%x」は「hoge1」になる。
さらに
NDC.pop();
すると、データが無くなり「%x」は空文字になる。
不要になったら
NDC.remove();
で消し去る。
この機能はマルチスレッドに対応しているのがポイント。

で、何に使うかというと、
WEBアプリケーションのログで、1回のリクエストで複数のログを出力する場合、
アクセスが同時に複数あると、どのログがどのリクエストの操作なのかわからなくなる。
ログにセッションIDを出力することができれば、そのセッションIDだけを抽出することにより、
特定のリクエストを解析することが可能になり、便利なはず。
リクエストと言ったが、端末というかブラウザというか、複数の異なるセッションIDからのアクセスを識別するということになるかな。

具体的な使用例としては、サーブレットによる実装だろう。
以下のような感じ。
必要なアクセスに対してマッピングを設定すれば、ログに容易にセッションIDを出力可能になる。
package test.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.NDC;

public class Log4jFilter implements Filter {

public void init(FilterConfig conf) throws ServletException {
// 特にやる事なし。
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

// セッションがスタートしていることが前提。
NDC.push(((HttpServletRequest) request).getSession().getId());

try {
chain.doFilter(request, response);
} finally {
NDC.remove();
}

}

public void destroy() {
// 特にやる事なし。
}

}

ちなみに、MDCとは「Mapped Diagnostic Context」の略。
スタックではなくマッピングにて同様の処理を行う。
MDC.put(key, value);
レイアウト上では「%X{key}」が置き換わる。
関連記事
スポンサーサイト
検索フォーム
RSSリンクの表示
カレンダー
10 | 2010/11 | 12
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 - - - -
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。