【プログラミング】JAVA - log4jのNDCとMDC
2010/11/28 (日) 21:04
NDCとは「Nested Diagnostic Context」の略。
org.apache.log4j.NDC クラスを使う。
スタックするので、さらに
この状態で
さらに
不要になったら
この機能はマルチスレッドに対応しているのがポイント。
で、何に使うかというと、
WEBアプリケーションのログで、1回のリクエストで複数のログを出力する場合、
アクセスが同時に複数あると、どのログがどのリクエストの操作なのかわからなくなる。
ログにセッションIDを出力することができれば、そのセッションIDだけを抽出することにより、
特定のリクエストを解析することが可能になり、便利なはず。
リクエストと言ったが、端末というかブラウザというか、複数の異なるセッションIDからのアクセスを識別するということになるかな。
具体的な使用例としては、サーブレットによる実装だろう。
以下のような感じ。
必要なアクセスに対してマッピングを設定すれば、ログに容易にセッションIDを出力可能になる。
ちなみに、MDCとは「Mapped Diagnostic Context」の略。
スタックではなくマッピングにて同様の処理を行う。
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}」が置き換わる。
- 関連記事
-
- POI備忘録 其の弐 (2010/11/30)
- log4jのNDCとMDC (2010/11/28)
- POI備忘録 其の壱 (2010/11/27)