Add request log using jetty. (Default: disabled)

Configurable via kustvakt.conf
log.request.enabled = true

Change-Id: I2ebb6c7a83aa946ba2ec7d91c608978fe48f9cd5
diff --git a/Changes b/Changes
index 8cdea37..31334b6 100644
--- a/Changes
+++ b/Changes
@@ -3,6 +3,7 @@
 - Bug fixes & Spring 6.2.11 upgrade (kupietz)
 - Migrate to Hibernate 7x (kupietz)
 - Make statistics in VC list configurable (default: false)
+- Add request log using jetty. (default: disabled)
 
 # version 0.79
 
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
index 6545719..d1e95d7 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
@@ -118,6 +118,7 @@
     // another variable might be needed to define which metadata fields are restricted 
     private boolean isMetadataRestricted = false;
     private boolean totalResultCacheEnabled;
+    private boolean requestLogEnabled = false;
     
     private int guestTimeout;
     private int loginTimeout;
@@ -146,6 +147,8 @@
                 properties.getProperty("security.secure.random.algorithm", ""));
         setMessageDigestAlgorithm(
                 properties.getProperty("security.md.algorithm", "MD5"));
+        requestLogEnabled = Boolean.valueOf(properties.getProperty(
+                "log.request.enabled","false"));
     }
 
     /**
diff --git a/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java b/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java
index 9f55842..7465bcf 100644
--- a/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java
+++ b/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java
@@ -13,13 +13,18 @@
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee10.servlet.ServletHolder;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.CustomRequestLog;
+import org.eclipse.jetty.server.ForwardedRequestCustomizer;
+import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.RequestLog;
+import org.eclipse.jetty.server.RequestLogWriter;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.server.handler.ShutdownHandler;
-import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
-import org.eclipse.jetty.ee10.servlet.ServletHolder;
 import org.glassfish.jersey.server.ServerProperties;
 import org.glassfish.jersey.servlet.ServletContainer;
 import org.springframework.web.context.ContextLoaderListener;
@@ -152,12 +157,22 @@
         servletHolder.setInitOrder(1);
         contextHandler.addServlet(servletHolder, config.getBaseURL());
 
-        ServerConnector connector = new ServerConnector(server);
+        
+        HttpConfiguration httpConfig = new HttpConfiguration();
+        // EM: support for X-Forwarded headers
+        httpConfig.addCustomizer( new ForwardedRequestCustomizer() );
+        httpConfig.setRequestHeaderSize(64000);
+        HttpConnectionFactory connectionFactory = 
+        		new HttpConnectionFactory(httpConfig);
+
+        ServerConnector connector = new ServerConnector(server, 
+        		connectionFactory);
         connector.setPort(kargs.port);
         connector.setIdleTimeout(60000);
-        connector.getConnectionFactory(HttpConnectionFactory.class)
-                .getHttpConfiguration().setRequestHeaderSize(64000);
-
+        //connector.getConnectionFactory(HttpConnectionFactory.class)
+        //        .getHttpConfiguration().setRequestHeaderSize(64000);
+        
+        // MK:
         // Jetty 12: Use ShutdownHandler as a wrapper instead of building a HandlerList.
         // Older code (Jetty 11):
         // ShutdownHandler shutdownHandler = new ShutdownHandler(adminToken, true, false);
@@ -178,8 +193,12 @@
         }
         shutdownHandler.setHandler(contextHandler);
         server.setHandler(shutdownHandler);
-
-
+        
+        // setup request log 
+        if (config.isRequestLogEnabled()) {
+        	server.setRequestLog(createRequestLog());
+        }
+        
         server.setConnectors(new Connector[] { connector });
         try {
             log.info("Starting server on port: " + kargs.port);
@@ -194,6 +213,18 @@
         }
     }
 
+    private RequestLog createRequestLog() {
+    	RequestLogWriter logWriter = new RequestLogWriter();
+    	logWriter.setFilename("data/logs/jetty-requests.log");
+    	logWriter.setAppend(true);
+    	logWriter.setRetainDays(30);
+
+        // format: time, client IP, method + URI, status, bytes
+        String logFormat = "%{yyyy-MM-dd HH:mm:ss}t %{client}a \"%r\" %s %O";
+        RequestLog requestLog = new CustomRequestLog(logWriter, logFormat);
+        return requestLog;
+	}
+    
     @Setter
     public static class KustvaktArgs {
 
diff --git a/src/main/resources/kustvakt-lite.conf b/src/main/resources/kustvakt-lite.conf
index ba32850..4649206 100644
--- a/src/main/resources/kustvakt-lite.conf
+++ b/src/main/resources/kustvakt-lite.conf
@@ -1,3 +1,6 @@
+# This is the default configuration for Kustvakt lite version
+# Copy this file to data/kustvakt-lite.conf and adjust settings
+
 # Krill settings
 
 # index dir
@@ -17,7 +20,6 @@
 current.api.version = v1.0
 # multiple versions separated by space
 supported.api.version = v1.0
-
 # default
 kustvakt.base.url=/api/*
 
@@ -25,6 +27,12 @@
 server.port=8089
 server.host=localhost
 
+# log
+log.request.enabled = false
+
+# Cache
+cache.total.results.enabled = true
+
 # Pipe (optional) 
 # pipe.host=https://korap.ids-mannheim.de (default)
 
diff --git a/src/main/resources/kustvakt.conf b/src/main/resources/kustvakt.conf
index 61cad26..31642af 100644
--- a/src/main/resources/kustvakt.conf
+++ b/src/main/resources/kustvakt.conf
@@ -1,3 +1,6 @@
+# This is the default configuration for Kustvakt full version
+# Copy this file to data/kustvakt.conf and adjust settings
+
 #Krill
 krill.indexDir= sample-index
 
@@ -21,10 +24,17 @@
 server.port=8089
 server.host=localhost
 
+# log
+log.request.enabled = false
+
+# Cache
+cache.total.results.enabled = true
+
 # Timeout
 # timeout.guest = 10000 (default)
 # timeout.login = 90000 (default)
 
+
 # Pipe (optional) 
 # pipe.host=https://korap.ids-mannheim.de
 
@@ -39,6 +49,7 @@
 
 # Virtual corpus and queries
 max.user.persistent.queries = 5
+# max.token.context.size = 40
 vc.list.statistics.enabled = false
 
 # Availability regex only support |
@@ -67,6 +78,7 @@
 # scopes separated by space
 oauth2.default.scopes = search match_info 
 oauth2.client.credentials.scopes = client_info
+oauth2.initial.super.client = false
 
 ## see SecureRandom Number Generation Algorithms
 ## optional