`

log4jのNDCとMDC

 
阅读更多

http://takya2.blog33.fc2.com/blog-entry-18.html

 

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

1
NDC.push("hoge1");

とかすると、ログ出力レイアウト上の「%x」が置き換わる。
スタックするので、さらに

1
NDC.push("hoge2");

とかすると、「%x」は「hoge1 hoge2」になる。
この状態で

1
NDC.pop();

すると、末尾のデータが無くなり「%x」は「hoge1」になる。
さらに

1
NDC.pop();

すると、データが無くなり「%x」は空文字になる。
不要になったら

1
NDC.remove();

で消し去る。
この機能はマルチスレッドに対応しているのがポイント。

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

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

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
31
32
33
34
35
36
37
38
39
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」の略。
スタックではなくマッピングにて同様の処理を行う。

1
MDC.put(key, value);

レイアウト上では「%X{key}」が置き換わる。

 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics