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