From a610b443e46ebea1c97899caba81a9f774ecaef9 Mon Sep 17 00:00:00 2001 From: Colin McDonald Date: Mon, 24 Oct 2016 16:58:49 -0400 Subject: [PATCH] Fix URL length limit, filter lookup URLs in log entries (for length) --- src/main/java/net/frozenorb/apiv3/APIv3.java | 5 ++- .../unsorted/FilteringLoggerHandler.java | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/frozenorb/apiv3/unsorted/FilteringLoggerHandler.java diff --git a/src/main/java/net/frozenorb/apiv3/APIv3.java b/src/main/java/net/frozenorb/apiv3/APIv3.java index f9aa9aa..150a6e2 100644 --- a/src/main/java/net/frozenorb/apiv3/APIv3.java +++ b/src/main/java/net/frozenorb/apiv3/APIv3.java @@ -101,6 +101,7 @@ import net.frozenorb.apiv3.serialization.jackson.InstantJsonSerializer; import net.frozenorb.apiv3.serialization.jackson.UuidJsonDeserializer; import net.frozenorb.apiv3.serialization.jackson.UuidJsonSerializer; import net.frozenorb.apiv3.serialization.mongodb.UuidCodecProvider; +import net.frozenorb.apiv3.unsorted.FilteringLoggerHandler; import net.frozenorb.apiv3.util.EmailUtils; import org.bson.Document; import org.bson.codecs.BsonValueCodecProvider; @@ -283,7 +284,9 @@ public final class APIv3 extends AbstractVerticle { private void setupHttpServer() { HttpServerOptions httpServerOptions = new HttpServerOptions(); + httpServerOptions.setCompressionSupported(true); + httpServerOptions.setMaxInitialLineLength(Integer.MAX_VALUE); if (!config.getProperty("http.keystoreFile").isEmpty()) { httpServerOptions.setSsl(true); @@ -297,7 +300,7 @@ public final class APIv3 extends AbstractVerticle { HttpServer webServer = vertx.createHttpServer(httpServerOptions); Router http = Router.router(vertx); // we just name this http to make the route declarations easier to read - http.route().handler(LoggerHandler.create(LoggerFormat.TINY)); + http.route().handler(new FilteringLoggerHandler()); http.route().handler(TimeoutHandler.create(TimeUnit.SECONDS.toMillis(5))); http.route().method(HttpMethod.PUT).method(HttpMethod.POST).method(HttpMethod.DELETE).handler(BodyHandler.create()); http.route().handler(new ActorAttributeHandler()); diff --git a/src/main/java/net/frozenorb/apiv3/unsorted/FilteringLoggerHandler.java b/src/main/java/net/frozenorb/apiv3/unsorted/FilteringLoggerHandler.java new file mode 100644 index 0000000..e2850ee --- /dev/null +++ b/src/main/java/net/frozenorb/apiv3/unsorted/FilteringLoggerHandler.java @@ -0,0 +1,45 @@ +package net.frozenorb.apiv3.unsorted; + +import io.vertx.core.Handler; +import io.vertx.core.http.HttpMethod; +import io.vertx.core.http.HttpServerRequest; +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; +import io.vertx.ext.web.RoutingContext; + +public final class FilteringLoggerHandler implements Handler { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void handle(RoutingContext ctx) { + long timestamp = System.currentTimeMillis(); + HttpMethod method = ctx.request().method(); + String uri = ctx.request().uri(); + + if (uri.startsWith("/lookup/byUuid") || uri.startsWith("/lookup/byName")) { + ctx.next(); + return; + } + + ctx.addBodyEndHandler(v -> log(ctx, timestamp, method, uri)); + ctx.next(); + } + + private void log(RoutingContext context, long timestamp, HttpMethod method, String uri) { + HttpServerRequest request = context.request(); + long contentLength = request.response().bytesWritten(); + int status = request.response().getStatusCode(); + + String message = String.format("%s %s %d %d - %d ms", method, uri, status, contentLength, System.currentTimeMillis() - timestamp); + + if (status >= 500) { + logger.error(message); + } else if(status >= 400) { + logger.warn(message); + } else { + logger.info(message); + } + } + +} \ No newline at end of file