Java tutorial
/** * Copyright (C) 2012 Ness Computing, Inc. * * 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.nesscomputing.httpserver.log; import java.util.List; import java.util.Map; import javax.servlet.http.Cookie; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.MDC; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.Duration; import com.nesscomputing.serverinfo.ServerInfo; public final class LogFields { private LogFields() { } public static void validateLogFields(final Map<String, LogField> knownFields, final List<String> fields) { for (String fieldSpecifier : fields) { String[] chunks = StringUtils.split(fieldSpecifier, ":"); if (chunks.length > 2) { throw new IllegalArgumentException( String.format("Bad specifier \"%s\" has too many colons", fieldSpecifier)); } String fieldKey = chunks[0]; if (!knownFields.containsKey(fieldKey)) { throw new IllegalArgumentException( String.format("Invalid log pattern: unknown field <%s>", fieldSpecifier)); } } } public interface LogField { Object log(Request request, Response response, String dummy); String getShortName(); } public static class RemoteAddrField implements LogField { RemoteAddrField() { } @Override public Object log(Request request, Response response, String dummy) { return request.getRemoteAddr(); } @Override public String getShortName() { return "ip"; } } public static class MethodField implements LogField { MethodField() { } @Override public Object log(Request request, Response response, String dummy) { return request.getMethod(); } @Override public String getShortName() { return "m"; } } public static class RequestUriField implements LogField { RequestUriField() { } @Override public Object log(Request request, Response response, String dummy) { return request.getRequestURL(); } @Override public String getShortName() { return "u"; } } public static class ResponseCodeField implements LogField { ResponseCodeField() { } @Override public Object log(Request request, Response response, String dummy) { return response.getStatus(); } @Override public String getShortName() { return "rc"; } } public static class ElapsedTimeField implements LogField { ElapsedTimeField() { } @Override public Object log(Request request, Response response, String dummy) { final DateTime start = new DateTime(request.getTimeStamp(), DateTimeZone.UTC); final DateTime end = new DateTime(DateTimeZone.UTC); return new Duration(start, end).getMillis(); } @Override public String getShortName() { return "t"; } } public static class QueryStringField implements LogField { QueryStringField() { } @Override public Object log(Request request, Response response, String dummy) { return request.getQueryString(); } @Override public String getShortName() { return "q"; } } public static class CookieField implements LogField { CookieField() { } @Override public Object log(Request request, Response response, String cookieName) { final Cookie[] cookies = request.getCookies(); if (StringUtils.trimToNull(cookieName) != null && cookies != null) { for (Cookie cookie : cookies) { if (cookieName.equalsIgnoreCase(cookie.getName())) { return cookie.getValue(); } } } return null; } @Override public String getShortName() { return "co"; } } public static class RequestContentLengthField implements LogField { RequestContentLengthField() { } @Override public Object log(Request request, Response response, String dummy) { return request.getContentLength(); } @Override public String getShortName() { return "cl"; } } public static class ResponseContentLengthField implements LogField { ResponseContentLengthField() { } @Override public Object log(Request request, Response response, String dummy) { return response.getContentCount(); } @Override public String getShortName() { return "cc"; } } public static class RequestHeaderField implements LogField { RequestHeaderField() { } @Override public Object log(Request request, Response response, String header) { if (StringUtils.trimToNull(header) == null) { return null; } return request.getHeader(header); } @Override public String getShortName() { return "rh"; } } public static class ResponseHeaderField implements LogField { ResponseHeaderField() { } @Override public Object log(Request request, Response response, String header) { if (StringUtils.trimToNull(header) == null) { return null; } return response.getHeader(header); } @Override public String getShortName() { return "rs"; } } public static class AttributeField implements LogField { AttributeField() { } @Override public Object log(Request request, Response response, String attribute) { return request.getAttribute(attribute); } @Override public String getShortName() { return "ra"; // Request attribute } } public static class RequestContentTypeField implements LogField { RequestContentTypeField() { } @Override public Object log(Request request, Response response, String dummy) { return request.getContentType(); } @Override public String getShortName() { return "rt"; } } public static class ResponseContentTypeField implements LogField { ResponseContentTypeField() { } @Override public Object log(Request request, Response response, String dummy) { return response.getContentType(); } @Override public String getShortName() { return "ru"; } } public static class RequestDateHeaderField implements LogField { RequestDateHeaderField() { } @Override public Object log(Request request, Response response, String dummy) { final long dateValue = request.getDateHeader("Date"); if (dateValue > 0) { return dateValue; } return null; } @Override public String getShortName() { return "rd"; } } public static class ThreadNameField implements LogField { ThreadNameField() { } @Override public String log(Request request, Response response, String dummy) { return Thread.currentThread().getName(); } @Override public String getShortName() { return "tn"; } } public static class ServerInfoBinaryField implements LogField { ServerInfoBinaryField() { } @Override public String log(Request request, Response response, String dummy) { final Object value = ServerInfo.get(ServerInfo.SERVER_BINARY); return value == null ? null : value.toString(); } @Override public String getShortName() { return "sib"; } } public static class ServerInfoVersionField implements LogField { ServerInfoVersionField() { } @Override public String log(Request request, Response response, String dummy) { final Object value = ServerInfo.get(ServerInfo.SERVER_VERSION); return value == null ? null : value.toString(); } @Override public String getShortName() { return "siv"; } } public static class ServerInfoModeField implements LogField { ServerInfoModeField() { } @Override public String log(Request request, Response response, String dummy) { final Object value = ServerInfo.get(ServerInfo.SERVER_MODE); return value == null ? null : value.toString(); } @Override public String getShortName() { return "sim"; } } public static class ServerInfoTypeField implements LogField { ServerInfoTypeField() { } @Override public String log(Request request, Response response, String dummy) { final Object value = ServerInfo.get(ServerInfo.SERVER_TYPE); return value == null ? null : value.toString(); } @Override public String getShortName() { return "sit"; } } public static class ServerInfoTokenField implements LogField { ServerInfoTokenField() { } @Override public String log(Request request, Response response, String dummy) { final Object value = ServerInfo.get(ServerInfo.SERVER_TOKEN); return value == null ? null : value.toString(); } @Override public String getShortName() { return "sio"; } } public static class TimestampField implements LogField { TimestampField() { } @Override public Object log(Request request, Response response, String dummy) { return new DateTime(request.getTimeStamp(), DateTimeZone.UTC); } @Override public String getShortName() { return "ts"; } } public static class MDCField implements LogField { MDCField() { } @Override public Object log(Request request, Response response, String name) { return MDC.get(name); } @Override public String getShortName() { return "md"; } } }