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 {
}
}
<!-- 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の記述順序を参照