From 1732cf9243b936396f419c92ee7e750fa638c767 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Tue, 20 Oct 2020 15:27:36 -0400 Subject: [PATCH] Add filters/tasks to enable/disable request logging. --- .../textsecuregcm/WhisperServerService.java | 5 +++++ .../util/logging/RequestLogEnabledFilter.java | 18 +++++++++++++++++ .../RequestLogEnabledFilterFactory.java | 15 ++++++++++++++ .../util/logging/RequestLogManager.java | 17 ++++++++++++++++ .../workers/DisableRequestLoggingTask.java | 20 +++++++++++++++++++ .../workers/EnableRequestLoggingTask.java | 20 +++++++++++++++++++ ...io.dropwizard.logging.filter.FilterFactory | 1 + .../logging/WebsocketRequestLog.java | 9 +++++---- .../WebsocketRequestLoggerFactory.java | 17 ++++++++-------- 9 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogEnabledFilter.java create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogEnabledFilterFactory.java create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogManager.java create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/workers/DisableRequestLoggingTask.java create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/workers/EnableRequestLoggingTask.java create mode 100644 service/src/main/resources/META-INF/services/io.dropwizard.logging.filter.FilterFactory diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index e8603b0bc..75c0bef15 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -157,6 +157,8 @@ import org.whispersystems.textsecuregcm.websocket.ProvisioningConnectListener; import org.whispersystems.textsecuregcm.websocket.WebSocketAccountAuthenticator; import org.whispersystems.textsecuregcm.workers.CertificateCommand; import org.whispersystems.textsecuregcm.workers.DeleteUserCommand; +import org.whispersystems.textsecuregcm.workers.DisableRequestLoggingTask; +import org.whispersystems.textsecuregcm.workers.EnableRequestLoggingTask; import org.whispersystems.textsecuregcm.workers.GetRedisCommandStatsCommand; import org.whispersystems.textsecuregcm.workers.GetRedisSlowlogCommand; import org.whispersystems.textsecuregcm.workers.VacuumCommand; @@ -451,6 +453,9 @@ public class WhisperServerService extends Application extends Filter { + + private volatile boolean requestLoggingEnabled = false; + + @Override + public FilterReply decide(final E event) { + return requestLoggingEnabled ? FilterReply.NEUTRAL : FilterReply.DENY; + } + + public void setRequestLoggingEnabled(final boolean requestLoggingEnabled) { + this.requestLoggingEnabled = requestLoggingEnabled; + } +} diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogEnabledFilterFactory.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogEnabledFilterFactory.java new file mode 100644 index 000000000..ea4664aa1 --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogEnabledFilterFactory.java @@ -0,0 +1,15 @@ +package org.whispersystems.textsecuregcm.util.logging; + +import ch.qos.logback.access.spi.IAccessEvent; +import ch.qos.logback.core.filter.Filter; +import com.fasterxml.jackson.annotation.JsonTypeName; +import io.dropwizard.logging.filter.FilterFactory; + +@JsonTypeName("requestLogEnabled") +class RequestLogEnabledFilterFactory implements FilterFactory { + + @Override + public Filter build() { + return RequestLogManager.getHttpRequestLogFilter(); + } +} diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogManager.java new file mode 100644 index 000000000..15970bb58 --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/logging/RequestLogManager.java @@ -0,0 +1,17 @@ +package org.whispersystems.textsecuregcm.util.logging; + +import ch.qos.logback.access.spi.IAccessEvent; +import ch.qos.logback.core.filter.Filter; +import org.whispersystems.websocket.logging.WebsocketEvent; + +public class RequestLogManager { + private static final RequestLogEnabledFilter HTTP_REQUEST_LOG_FILTER = new RequestLogEnabledFilter<>(); + + static Filter getHttpRequestLogFilter() { + return HTTP_REQUEST_LOG_FILTER; + } + + public static void setRequestLoggingEnabled(final boolean enabled) { + HTTP_REQUEST_LOG_FILTER.setRequestLoggingEnabled(enabled); + } +} diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/workers/DisableRequestLoggingTask.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/DisableRequestLoggingTask.java new file mode 100644 index 000000000..7e3d576fb --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/DisableRequestLoggingTask.java @@ -0,0 +1,20 @@ +package org.whispersystems.textsecuregcm.workers; + +import io.dropwizard.servlets.tasks.Task; +import org.whispersystems.textsecuregcm.util.logging.RequestLogManager; + +import java.io.PrintWriter; +import java.util.List; +import java.util.Map; + +public class DisableRequestLoggingTask extends Task { + + public DisableRequestLoggingTask() { + super("disable-request-logging"); + } + + @Override + public void execute(final Map> map, final PrintWriter printWriter) { + RequestLogManager.setRequestLoggingEnabled(false); + } +} diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/workers/EnableRequestLoggingTask.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/EnableRequestLoggingTask.java new file mode 100644 index 000000000..a530ace3c --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/EnableRequestLoggingTask.java @@ -0,0 +1,20 @@ +package org.whispersystems.textsecuregcm.workers; + +import io.dropwizard.servlets.tasks.Task; +import org.whispersystems.textsecuregcm.util.logging.RequestLogManager; + +import java.io.PrintWriter; +import java.util.List; +import java.util.Map; + +public class EnableRequestLoggingTask extends Task { + + public EnableRequestLoggingTask() { + super("enable-request-logging"); + } + + @Override + public void execute(final Map> map, final PrintWriter printWriter) { + RequestLogManager.setRequestLoggingEnabled(true); + } +} diff --git a/service/src/main/resources/META-INF/services/io.dropwizard.logging.filter.FilterFactory b/service/src/main/resources/META-INF/services/io.dropwizard.logging.filter.FilterFactory new file mode 100644 index 000000000..5e33b192a --- /dev/null +++ b/service/src/main/resources/META-INF/services/io.dropwizard.logging.filter.FilterFactory @@ -0,0 +1 @@ +org.whispersystems.textsecuregcm.util.logging.RequestLogEnabledFilterFactory diff --git a/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLog.java b/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLog.java index 4fb574199..8fbac2f27 100644 --- a/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLog.java +++ b/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLog.java @@ -4,18 +4,19 @@ */ package org.whispersystems.websocket.logging; +import org.glassfish.jersey.server.ContainerRequest; +import org.glassfish.jersey.server.ContainerResponse; + import ch.qos.logback.core.Appender; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.AppenderAttachableImpl; import ch.qos.logback.core.spi.FilterAttachableImpl; import ch.qos.logback.core.spi.FilterReply; -import org.glassfish.jersey.server.ContainerRequest; -import org.glassfish.jersey.server.ContainerResponse; public class WebsocketRequestLog { - private AppenderAttachableImpl aai = new AppenderAttachableImpl<>(); - private FilterAttachableImpl fai = new FilterAttachableImpl<>(); + private final AppenderAttachableImpl aai = new AppenderAttachableImpl<>(); + private final FilterAttachableImpl fai = new FilterAttachableImpl<>(); public WebsocketRequestLog() { } diff --git a/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLoggerFactory.java b/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLoggerFactory.java index 2582d174a..697739394 100644 --- a/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLoggerFactory.java +++ b/websocket-resources/src/main/java/org/whispersystems/websocket/logging/WebsocketRequestLoggerFactory.java @@ -4,15 +4,7 @@ */ package org.whispersystems.websocket.logging; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.LoggerContext; import com.google.common.annotations.VisibleForTesting; -import io.dropwizard.logging.AppenderFactory; -import io.dropwizard.logging.ConsoleAppenderFactory; -import io.dropwizard.logging.async.AsyncAppenderFactory; -import io.dropwizard.logging.filter.LevelFilterFactory; -import io.dropwizard.logging.filter.NullLevelFilterFactory; -import io.dropwizard.logging.layout.LayoutFactory; import org.slf4j.LoggerFactory; import org.whispersystems.websocket.logging.layout.WebsocketEventLayoutFactory; @@ -21,6 +13,15 @@ import javax.validation.constraints.NotNull; import java.util.Collections; import java.util.List; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import io.dropwizard.logging.AppenderFactory; +import io.dropwizard.logging.ConsoleAppenderFactory; +import io.dropwizard.logging.async.AsyncAppenderFactory; +import io.dropwizard.logging.filter.LevelFilterFactory; +import io.dropwizard.logging.filter.NullLevelFilterFactory; +import io.dropwizard.logging.layout.LayoutFactory; + public class WebsocketRequestLoggerFactory { @VisibleForTesting