/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ package org.ebayopensource.turmeric.runtime.tests.common.jetty; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.mortbay.jetty.HttpHeaders; import org.mortbay.jetty.Request; import org.mortbay.jetty.Response; import org.mortbay.log.Log; import org.mortbay.util.TypeUtil; /** * Primitive Access Log handler to just dump access log style requests to the console. */ public class AccessLoggingHandler extends org.mortbay.jetty.handler.HandlerWrapper { private boolean logServer = true; private boolean logExtended = true; private boolean logCookies = true; private boolean logLatency = true; private void createLogEntry(int dispatch, Request request, Response response) { StringBuilder buf = new StringBuilder(); switch (dispatch) { case REQUEST: buf.append("[REQUEST] "); break; case DEFAULT: buf.append("[DEFAULT] "); break; case ERROR: buf.append("[ERROR] "); break; case FORWARD: buf.append("[FORWARD] "); break; case INCLUDE: buf.append("[INCLUDE] "); break; default: buf.append("[Dispatch:").append(dispatch).append("] "); } if (logServer) { buf.append(request.getServerName()); buf.append(' '); } buf.append(request.getRemoteAddr()); buf.append(" - "); String user = request.getRemoteUser(); buf.append((user == null) ? " - " : user); buf.append(" ["); buf.append(request.getTimeStampBuffer().toString()); buf.append("] \""); buf.append(request.getMethod()); buf.append(' '); buf.append(request.getUri()); buf.append(' '); buf.append(request.getProtocol()); buf.append("\" "); int status = response.getStatus(); if (status <= 0) { status = 404; } buf.append((char) ('0' + ((status / 100) % 10))); buf.append((char) ('0' + ((status / 10) % 10))); buf.append((char) ('0' + (status % 10))); long responseLength = response.getContentCount(); if (responseLength >= 0) { buf.append(' '); if (responseLength > 99999) { buf.append(Long.toString(responseLength)); } else { if (responseLength > 9999) buf.append((char) ('0' + ((responseLength / 10000) % 10))); if (responseLength > 999) buf.append((char) ('0' + ((responseLength / 1000) % 10))); if (responseLength > 99) buf.append((char) ('0' + ((responseLength / 100) % 10))); if (responseLength > 9) buf.append((char) ('0' + ((responseLength / 10) % 10))); buf.append((char) ('0' + (responseLength) % 10)); } buf.append(' '); } else { buf.append(" - "); } if (logExtended) { String referer = request.getHeader(HttpHeaders.REFERER); if (referer == null) { buf.append("\"-\" "); } else { buf.append('"').append(referer).append("\" "); } String agent = request.getHeader(HttpHeaders.USER_AGENT); if (agent == null) { buf.append("\"-\" "); } else { buf.append('"').append(agent).append('"'); } } if (logCookies) { Cookie[] cookies = request.getCookies(); if (cookies == null || cookies.length == 0) { buf.append(" -"); } else { buf.append(" \""); for (int i = 0; i < cookies.length; i++) { if (i != 0) { buf.append(';'); } buf.append(cookies[i].getName()); buf.append('='); buf.append(cookies[i].getValue()); } buf.append('\"'); } } if (logLatency) { buf.append(' '); buf.append(TypeUtil.toString(System.currentTimeMillis() - request.getTimeStamp())); } Log.info(buf.toString()); } @Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { try { super.handle(target, request, response, dispatch); } finally { createLogEntry(dispatch, (Request) request, (Response) response); } } }