FilterでWeb要求・応答をログ出力してみる

今、リクエストを受信した後に対外接続を行うシステムを作ってますが、がつがつと外部に繋ぐのも気が引けるという事で、、そのシミュレータとして簡単なWebAPも作りました。
APサーバは、WebLogic11G。作っているAPの仕様上、POSTをサーブレット処理してます。
で、結局Oracleのページに乗っていたグッドなサンプルをそのままパクってみました(汗)
Oracle Containers for J2EE サーブレット開発者ガイド
Request処理は解るのですが、Responseの方はFilter内でラップするというちょっと自分では考え付かない内容でした。。
上記に載っている、FilterServletOutputStreamとGenericResponseWrapperは、深く考えずに同一パッケージ内にそのままクラスとして作ります。
で、Filterクラスを作ってログを出力します。よく使っているlog4j2でやってます。

package jp.esoro.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStream;

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 javax.servlet.http.HttpServletResponse;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class PostFilter implements Filter {
	protected static Logger logger = LogManager.getLogger();
	
	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
 		try {
 			//要求
			HttpServletRequest req = (HttpServletRequest) request;
			
			BufferedReader body = new BufferedReader(req.getReader());
			String ret = body.readLine();
			//要求ロギング
			logger.info(req.getRemoteAddr()+"->"+req.getLocalAddr()+":"+req.getLocalPort()+req.getContextPath() + ":" + req.getMethod() + " RCV:"+ret);

			OutputStream out = response.getOutputStream();
			
			GenericResponseWrapper wrapper = 
			         new GenericResponseWrapper((HttpServletResponse) response); 
			//この後、サーブレット側処理に移ります
			chain.doFilter(request, wrapper);	
			
			//ラップしたwrapperからサーブレットの処理結果を取得
			byte[] data = wrapper.getData();
 			//OutputStreamに書き込んで応答
			out.write(data);
			out.close();
			//Shift-JISでString変換
			String result = new String(data, "Shift-JIS");
			//応答ロギング
			logger.info(req.getRemoteAddr()+"<-"+req.getLocalAddr()+ ":"+req.getLocalPort()+ req.getContextPath() + ":" + req.getMethod() + " SND:"+result);

		} catch (IOException e) {
			logger.error(e.getMessage());
		}
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}

で、web.xmlに上記Filterをセットします

 	<!-- Filter -->
	<filter>
		<filter-name>PostFilter</filter-name>
		<filter-class>jp.esoro.http.PostFilter</filter-class>
	</filter>
	<filter-mapping>
        <filter-name>PostFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

最初サーブレットはアノテーション@WebServletで書きましたが、どうも11Gだとダメっぽいのでweb.xmlにservletをMappingする事にしました。シミュレータは本当に簡単なAPなので。。
開発環境は他のプロジェクトで使うWebLogic12cのままで11Gを別途用意しなかったんですが、実行環境が違うとデプロイに失敗して結構メンドクサイです。コンパイラーJavaのバージョンをちゃんと確認してなかったからなんですけど、、

カテゴリー: JavaJavaEE   作成者: bokusui パーマリンク

bokusui について

ソフトウェアハウスでのPG・SEから始まり、10年近く勤めた金融系企業の社内SEを数年前にやめ、フリーランス時代を経たのち法人成りしました。システム開発の全工程をこじんまりとやり続けています。