| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you 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 org.apache.cloudstack; |
| |
| import com.cloud.utils.StringUtils; |
| import org.eclipse.jetty.server.NCSARequestLog; |
| import org.eclipse.jetty.server.Request; |
| import org.eclipse.jetty.server.Response; |
| import org.eclipse.jetty.util.DateCache; |
| import org.eclipse.jetty.util.component.LifeCycle; |
| |
| import java.util.Locale; |
| import java.util.TimeZone; |
| |
| import static org.apache.commons.configuration.DataConfiguration.DEFAULT_DATE_FORMAT; |
| |
| public class ACSRequestLog extends NCSARequestLog { |
| private static final ThreadLocal<StringBuilder> buffers = |
| ThreadLocal.withInitial(() -> new StringBuilder(256)); |
| |
| private final DateCache dateCache; |
| |
| public ACSRequestLog() { |
| super(); |
| |
| TimeZone timeZone = TimeZone.getTimeZone("GMT"); |
| Locale locale = Locale.getDefault(); |
| dateCache = new DateCache(DEFAULT_DATE_FORMAT, locale, timeZone); |
| } |
| |
| @Override |
| public void log(Request request, Response response) { |
| String requestURI = StringUtils.cleanString(request.getOriginalURI()); |
| try { |
| StringBuilder sb = buffers.get(); |
| sb.setLength(0); |
| |
| sb.append(request.getHttpChannel().getEndPoint() |
| .getRemoteAddress().getAddress() |
| .getHostAddress()) |
| .append(" - - [") |
| .append(dateCache.format(request.getTimeStamp())) |
| .append("] \"") |
| .append(request.getMethod()) |
| .append(" ") |
| .append(requestURI) |
| .append(" ") |
| .append(request.getProtocol()) |
| .append("\" ") |
| .append(response.getStatus()) |
| .append(" ") |
| .append(response.getHttpChannel().getBytesWritten()) // apply filter here? |
| .append(" \"-\" \"") |
| .append(request.getHeader("User-Agent")) |
| .append("\""); |
| |
| write(sb.toString()); |
| } catch (Exception e) { |
| LOG.warn("Unable to log request", e); |
| } |
| } |
| |
| @Override |
| protected void stop(LifeCycle lifeCycle) throws Exception { |
| buffers.remove(); |
| super.stop(lifeCycle); |
| } |
| } |