概要

Log4jフレームワークには、NDCというThreadLocal?なオブジェクトがあり、
ここに主処理の前にユーザー名などをセットしておくと、logを出力するときに一緒に NDC情報を出力してくれます。
Logを解析するときにはgrepをかけるなりすれば、あるユーザの操作のみを簡単に抽出 できるというわけ。

 

Log4jについては、Jakarta CommonsLogging/log4jを参照

ソースコード

public class Log4jNDCFilter
 implements Filter {
 /**
  * デフォルトコンストラクタ
  */
 public Log4jNDCFilter() {
   super();
 }

 /* (非 Javadoc)
  * @see javax.servlet.Filter#destroy()
  */
  public void destroy() {
 }

 /* (非 Javadoc)
  * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
  * javax.servlet.ServletResponse, javax.servlet.FilterChain)
  */
 public void doFilter(
   ServletRequest req, ServletResponse res, FilterChain chain)
   throws IOException, ServletException {
 	
 	if( req instanceof HttpServletRequest ){
 	  // HTTPでのリクエストなら、ユーザ名をNDCにセットする
 	  NDC.push( ((HttpServletRequest)req).getRemoteUser() );
 	}else{
 	  // HTTP以外のリクエストなら、接続元のホスト名をNDCにセットする
 	  NDC.push(req.getRemoteHost());
 	}
 	
   // 次のフィルタ/サーブレット を実行する。
   // このとき、ServletではThreadが再利用されるから、
   // 何が起ころうとNDCにセットしたユーザ名/ホスト名
   // を取り除かなくてはいけない事に留意する
   try {
     chain.doFilter(req, res);
   } finally {
     NDC.remove();
   }
 }

 /*
  * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
  */
 public void init(FilterConfig arg0) throws ServletException {
 }
}

web.xml

<!-- Filter -->
<filter>
  <filter-name>Log4jNDCFilter</filter-name>
  <filter-class>com.foo.Log4jNDCFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>Log4jNDCFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

web.xmlの記述順序を参照


Java#JavaEE


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2006-02-18 (土) 03:03:31 (3941d)
ISBN10
ISBN13
9784061426061