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

io.dropwizard.logging.json.layout.AccessJsonLayout Maven / Gradle / Ivy

package io.dropwizard.logging.json.layout;

import ch.qos.logback.access.spi.IAccessEvent;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Sets;
import com.google.common.net.HttpHeaders;
import io.dropwizard.logging.json.AccessAttribute;

import javax.annotation.Nullable;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Builds JSON messages from access log events as {@link IAccessEvent}.
 */
public class AccessJsonLayout extends AbstractJsonLayout {

    private ImmutableSet includes;

    private ImmutableSet requestHeaders = ImmutableSortedSet.of();
    private ImmutableSet responseHeaders = ImmutableSortedSet.of();

    @Nullable
    private String jsonProtocolVersion;

    private final TimestampFormatter timestampFormatter;
    private final Map additionalFields;
    private final Map customFieldNames;

    public AccessJsonLayout(JsonFormatter jsonFormatter, TimestampFormatter timestampFormatter,
                            Set includes, Map customFieldNames,
                            Map additionalFields) {
        super(jsonFormatter);
        this.timestampFormatter = timestampFormatter;
        this.additionalFields = ImmutableMap.copyOf(additionalFields);
        this.customFieldNames = ImmutableMap.copyOf(customFieldNames);
        this.includes = Sets.immutableEnumSet(includes);
    }

    @Override
    protected Map toJsonMap(IAccessEvent event) {
        return new MapBuilder(timestampFormatter, customFieldNames, additionalFields, 20)
            .add("port", isIncluded(AccessAttribute.LOCAL_PORT), event.getLocalPort())
            .add("contentLength", isIncluded(AccessAttribute.CONTENT_LENGTH), event.getContentLength())
            .addTimestamp("timestamp", isIncluded(AccessAttribute.TIMESTAMP), event.getTimeStamp())
            .add("method", isIncluded(AccessAttribute.METHOD), event.getMethod())
            .add("protocol", isIncluded(AccessAttribute.PROTOCOL), event.getProtocol())
            .add("requestContent", isIncluded(AccessAttribute.REQUEST_CONTENT), event.getRequestContent())
            .add("remoteAddress", isIncluded(AccessAttribute.REMOTE_ADDRESS), event.getRemoteAddr())
            .add("remoteUser", isIncluded(AccessAttribute.REMOTE_USER), event.getRemoteUser())
            .add("headers", !requestHeaders.isEmpty(),
                filterHeaders(event.getRequestHeaderMap(), requestHeaders))
            .add("params", isIncluded(AccessAttribute.REQUEST_PARAMETERS), event.getRequestParameterMap())
            .add("requestTime", isIncluded(AccessAttribute.REQUEST_TIME), event.getElapsedTime())
            .add("uri", isIncluded(AccessAttribute.REQUEST_URI), event.getRequestURI())
            .add("url", isIncluded(AccessAttribute.REQUEST_URL), event.getRequestURL())
            .add("remoteHost", isIncluded(AccessAttribute.REMOTE_HOST), event.getRemoteHost())
            .add("responseContent", isIncluded(AccessAttribute.RESPONSE_CONTENT), event.getResponseContent())
            .add("responseHeaders", !responseHeaders.isEmpty(),
                filterHeaders(event.getResponseHeaderMap(), responseHeaders))
            .add("serverName", isIncluded(AccessAttribute.SERVER_NAME), event.getServerName())
            .add("status", isIncluded(AccessAttribute.STATUS_CODE), event.getStatusCode())
            .add("userAgent", isIncluded(AccessAttribute.USER_AGENT), event.getRequestHeader(HttpHeaders.USER_AGENT))
            .add("version", jsonProtocolVersion != null, jsonProtocolVersion)
            .build();
    }

    private boolean isIncluded(AccessAttribute userAgent) {
        return includes.contains(userAgent);
    }

    private Map filterHeaders(Map headers, Set filteredHeaderNames) {
        if (filteredHeaderNames.isEmpty()) {
            return ImmutableMap.of();
        }
        return headers.entrySet().stream()
            .filter(e -> filteredHeaderNames.contains(e.getKey()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }

    public ImmutableSet getIncludes() {
        return includes;
    }

    public void setIncludes(Set includes) {
        this.includes = Sets.immutableEnumSet(includes);
    }

    @Nullable
    public String getJsonProtocolVersion() {
        return jsonProtocolVersion;
    }

    public void setJsonProtocolVersion(@Nullable String jsonProtocolVersion) {
        this.jsonProtocolVersion = jsonProtocolVersion;
    }

    public ImmutableSet getRequestHeaders() {
        return requestHeaders;
    }

    public void setRequestHeaders(Set requestHeaders) {
        this.requestHeaders = ImmutableSortedSet.copyOf(String::compareToIgnoreCase, requestHeaders);
    }

    public ImmutableSet getResponseHeaders() {
        return responseHeaders;
    }

    public void setResponseHeaders(Set responseHeaders) {
        this.responseHeaders = ImmutableSortedSet.copyOf(String::compareToIgnoreCase, responseHeaders);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy