All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.common.web.handler.HttpAccessLogHandler Maven / Gradle / Ivy

package nablarch.common.web.handler;

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;

import nablarch.fw.ExecutionContext;
import nablarch.fw.Handler;
import nablarch.fw.web.HttpErrorResponse;
import nablarch.fw.web.HttpRequest;
import nablarch.fw.web.HttpResponse;
import nablarch.fw.web.handler.HttpAccessLogFormatter.HttpAccessLogContext;
import nablarch.fw.web.handler.HttpAccessLogUtil;
import nablarch.fw.web.servlet.ServletExecutionContext;

/**
 * HTTPアクセスログを出力するクラス。
 * 
 * ロガー名は"HTTP_ACCESS"を使用し、INFOレベルで出力する。
 * {@link #handle(HttpRequest, ExecutionContext)}メソッドの引数{@link ExecutionContext}は、
 * リクエスト情報を取得するために{@link nablarch.fw.web.servlet.ServletExecutionContext}にダウンキャストして使用する。
 * 
* @author Kiyohito Itoh */ public class HttpAccessLogHandler implements Handler { /** * {@link nablarch.fw.web.handler.HttpAccessLogFormatter}を初期化する。 */ public HttpAccessLogHandler() { HttpAccessLogUtil.initialize(); } /** * HTTPアクセスログを出力する。 * @param req {@link HttpRequest} * @param context {@link ExecutionContext} * @return 次のハンドラの処理結果 * @throws ClassCastException * context の型が {@link ServletExecutionContext} でない場合。 */ public HttpResponse handle(HttpRequest req, ExecutionContext context) throws ClassCastException { ServletExecutionContext ctx = (ServletExecutionContext) context; HttpAccessLogContext logContext = HttpAccessLogUtil.getAccessLogContext(req, ctx); writeBeginLog(req, ctx, logContext); HttpResponse response = null; try { response = context.handleNext(req); } catch (HttpErrorResponse errorResponse) { response = errorResponse.getResponse(); throw errorResponse; } finally { writeEndLog(req, ctx, logContext, response); } return response; } /** * リクエスト処理開始時のログを出力する。 * @param request {@link HttpRequest} * @param context {@link ExecutionContext} * @param logContext {@link HttpAccessLogContext} */ protected void writeBeginLog(HttpRequest request, ServletExecutionContext context, HttpAccessLogContext logContext) { Object[] requestLogOptions = getRequestOptions(request, context); HttpAccessLogUtil.begin(logContext, requestLogOptions); if (HttpAccessLogUtil.containsMemoryItem()) { MemoryMXBean memory = ManagementFactory.getMemoryMXBean(); MemoryUsage heapMemory = memory.getHeapMemoryUsage(); long max = heapMemory.getMax(); logContext.setMaxMemory(max); logContext.setFreeMemory(max - heapMemory.getUsed()); } logContext.setStartTime(System.currentTimeMillis()); } /** * リクエスト処理終了時のログを出力する。 * @param request {@link HttpRequest} * @param context {@link ExecutionContext} * @param logContext {@link HttpAccessLogContext} * @param response {@link HttpResponse} */ protected void writeEndLog(HttpRequest request, ServletExecutionContext context, HttpAccessLogContext logContext, HttpResponse response) { logContext.setEndTime(System.currentTimeMillis()); if (response != null) { logContext.setResponse(response); } Object[] responseOptions = getResponseOptions(request, response, context); HttpAccessLogUtil.end(logContext, responseOptions); } /** 空のオプション情報 */ private static final Object[] EMPTY_OPTIONS = new Object[0]; /** * リクエスト時のオプション情報を取得する。
* デフォルト実装ではnullを返す。 * @param request {@link HttpRequest} * @param context {@link ExecutionContext} * @return オプション情報。指定しない場合はnull */ protected Object[] getRequestOptions(HttpRequest request, ExecutionContext context) { return EMPTY_OPTIONS; } /** * レスポンス時のオプション情報を取得する。
* デフォルト実装ではnullを返す。 * @param request {@link HttpRequest} * @param response {@link HttpResponse} * @param context {@link ExecutionContext} * @return オプション情報。指定しない場合はnull */ protected Object[] getResponseOptions(HttpRequest request, HttpResponse response, ExecutionContext context) { return EMPTY_OPTIONS; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy