diff options
Diffstat (limited to 'java/com/google/gerrit/pgm/http/jetty/HttpLog.java')
-rw-r--r-- | java/com/google/gerrit/pgm/http/jetty/HttpLog.java | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/java/com/google/gerrit/pgm/http/jetty/HttpLog.java b/java/com/google/gerrit/pgm/http/jetty/HttpLog.java new file mode 100644 index 0000000000..b7ec2be684 --- /dev/null +++ b/java/com/google/gerrit/pgm/http/jetty/HttpLog.java @@ -0,0 +1,114 @@ +// Copyright (C) 2010 The Android Open Source Project +// +// 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.google.gerrit.pgm.http.jetty; + +import com.google.common.base.Strings; +import com.google.gerrit.httpd.GetUserFilter; +import com.google.gerrit.httpd.restapi.LogRedactUtil; +import com.google.gerrit.server.util.SystemLog; +import com.google.gerrit.server.util.time.TimeUtil; +import com.google.inject.Inject; +import org.apache.log4j.AsyncAppender; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.LoggingEvent; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.RequestLog; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.component.AbstractLifeCycle; + +/** Writes the {@code httpd_log} file with per-request data. */ +class HttpLog extends AbstractLifeCycle implements RequestLog { + private static final Logger log = Logger.getLogger(HttpLog.class); + private static final String LOG_NAME = "httpd_log"; + + interface HttpLogFactory { + HttpLog get(); + } + + protected static final String P_HOST = "Host"; + protected static final String P_USER = "User"; + protected static final String P_METHOD = "Method"; + protected static final String P_RESOURCE = "Resource"; + protected static final String P_PROTOCOL = "Version"; + protected static final String P_STATUS = "Status"; + protected static final String P_CONTENT_LENGTH = "Content-Length"; + protected static final String P_REFERER = "Referer"; + protected static final String P_USER_AGENT = "User-Agent"; + + private final AsyncAppender async; + + @Inject + HttpLog(SystemLog systemLog) { + async = systemLog.createAsyncAppender(LOG_NAME, new HttpLogLayout()); + } + + @Override + protected void doStart() throws Exception {} + + @Override + protected void doStop() throws Exception { + async.close(); + } + + @Override + public void log(Request req, Response rsp) { + final LoggingEvent event = + new LoggingEvent( // + Logger.class.getName(), // fqnOfCategoryClass + log, // logger + TimeUtil.nowMs(), // when + Level.INFO, // level + "", // message text + "HTTPD", // thread name + null, // exception information + null, // current NDC string + null, // caller location + null // MDC properties + ); + + String uri = req.getRequestURI(); + if (!Strings.isNullOrEmpty(req.getQueryString())) { + uri += "?" + LogRedactUtil.redactQueryString(req.getQueryString()); + } + String user = (String) req.getAttribute(GetUserFilter.USER_ATTR_KEY); + if (user != null) { + event.setProperty(P_USER, user); + } + + set(event, P_HOST, req.getRemoteAddr()); + set(event, P_METHOD, req.getMethod()); + set(event, P_RESOURCE, uri); + set(event, P_PROTOCOL, req.getProtocol()); + set(event, P_STATUS, rsp.getStatus()); + set(event, P_CONTENT_LENGTH, rsp.getContentCount()); + set(event, P_REFERER, req.getHeader("Referer")); + set(event, P_USER_AGENT, req.getHeader("User-Agent")); + + async.append(event); + } + + private static void set(LoggingEvent event, String key, String val) { + if (val != null && !val.isEmpty()) { + event.setProperty(key, val); + } + } + + private static void set(LoggingEvent event, String key, long val) { + if (0 < val) { + event.setProperty(key, String.valueOf(val)); + } + } +} |