=== modified file 'build.gradle'
--- old/build.gradle	2023-01-28 04:45:51 +0000
+++ new/build.gradle	2023-02-26 13:41:19 +0000
@@ -570,8 +570,10 @@
     fwdClient group: 'gettext', name: 'gettext.js', version: '1.2.0', ext: 'zip' // WARNING: this zip name is hardcoded in WebResourceHandler
     fwdClient group: 'org.apache.tika', name: 'tika-core', version: '1.18'
     
-    gwtRuntime group: 'com.google.gwt', name: 'gwt-user', version: '2.9.0'
-    gwtRuntime group: 'com.googlecode.gwt-validation', name: 'gwt-validation', version: '2.1'
+    gwtRuntime group: 'com.google.gwt', name: 'gwt-user', version: '2.10.0'
+    gwtRuntime (group: 'com.googlecode.gwt-validation', name: 'gwt-validation', version: '2.1') {
+        exclude group: 'org.slf4j', module: 'slf4j-simple'
+    }
     
     gwtRuntime group: 'org.freemarker', name: 'freemarker', version: '2.3.31'
     gwtRuntime (group: 'com.gwtplatform', name: 'gwtp-mvp-client', version: '1.6') {

=== modified file 'src/com/goldencode/p2j/main/ClientDriver.java'
--- old/src/com/goldencode/p2j/main/ClientDriver.java	2022-12-14 15:48:13 +0000
+++ new/src/com/goldencode/p2j/main/ClientDriver.java	2023-02-26 14:00:51 +0000
@@ -417,6 +417,11 @@
    {
       // for web and batch clients only redirect stderr to a log file
       setClientLog(args);
+
+      // init default log format after redirecting stderr above!
+      // do this as early as possible to ensure the same log format is used for log outputs before and
+      // after logging is configured
+      com.goldencode.p2j.util.LogHelper.initDefaultLoggingOptions();
       
       ClientDriver client = new ClientDriver();
       

=== modified file 'src/com/goldencode/p2j/main/ServerDriver.java'
--- old/src/com/goldencode/p2j/main/ServerDriver.java	2023-01-30 09:34:49 +0000
+++ new/src/com/goldencode/p2j/main/ServerDriver.java	2023-02-26 14:00:51 +0000
@@ -114,9 +114,7 @@
 package com.goldencode.p2j.main;
 
 import java.net.*;
-import java.security.*;
-import javax.net.ssl.*;
-import org.bouncycastle.jsse.provider.*;
+
 import com.goldencode.p2j.aspects.ltw.*;
 import com.goldencode.p2j.cfg.*;
 import com.goldencode.p2j.directory.*;
@@ -124,7 +122,6 @@
 import com.goldencode.p2j.net.*;
 import com.goldencode.p2j.security.*;
 import com.goldencode.p2j.security.SecurityManager;
-import com.goldencode.p2j.security.SecurityManager.*;
 import com.goldencode.p2j.util.*;
 
 /**
@@ -953,6 +950,10 @@
     */
    public static void main(String[] args)
    {
+      // do this as early as possible to ensure the same log format is used for log outputs before and
+      // after logging is configured
+      LogHelper.initDefaultLoggingOptions();
+
       ServerDriver server = new ServerDriver();
       FwdJMX.init();
       server.process(args);

=== modified file 'src/com/goldencode/p2j/util/LogHelper.java'
--- old/src/com/goldencode/p2j/util/LogHelper.java	2017-04-01 23:33:34 +0000
+++ new/src/com/goldencode/p2j/util/LogHelper.java	2023-02-26 14:26:51 +0000
@@ -306,6 +306,24 @@
          return initWorker(fhClass);
       }
    }
+
+   /**
+    * Configures default logging options. This method performs all the necessary logging changes early at
+    * the process startup. The security context is not accessed from this method.
+    */
+   public static void initDefaultLoggingOptions()
+   {
+      // ensure the correct log format is used even before logging is configued from the directory
+      CleanFormatter f = new CleanFormatter();
+      Logger rootLogger = Logger.getLogger("");
+      Handler[] handlers = rootLogger.getHandlers();
+      for (Handler handler : handlers) {
+         handler.setFormatter(f);
+      }
+
+      // force Jetty to send log output to java.util.logging
+      System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.JavaUtilLog");
+   }
       
    /**
     * Retrieve a logging object from the <code>LogManager</code>.
@@ -1038,10 +1056,29 @@
          
          Date dat = new Date(record.getMillis());
          
+         // shorten the qualified name to only include first letters for the package names
+         StringBuilder sb = null;
+         String sourceName = record.getSourceClassName();
+         if (sourceName != null)
+         {
+            sb = new StringBuilder();
+            String[] names = sourceName.split("\\.");
+            for (int i = 0; i < names.length - 2; i++)
+            {
+               String name = names[i];
+               if (name.length() > 0)
+               {
+                  sb.append(name.charAt(0));
+               }
+               sb.append(".");
+            }
+            sb.append(names[names.length - 1]);
+         }
+
          Object[] parms = new Object[]
          {
             sdf.get().format(dat),
-            record.getSourceClassName(),
+            sb != null ? sb.toString() : "",
             record.getLevel().toString(),
             record.getMessage(),
             SEP
@@ -1053,7 +1090,7 @@
          
          if (t != null)
          {
-            StringBuilder sb = new StringBuilder(out);
+            sb = new StringBuilder(out);
             dumpThrowable(t, sb);
             out = sb.toString();
          }

