From d0a0bd4da46ee81a9399601d6af77473d06fc2f8 Mon Sep 17 00:00:00 2001 From: ian Date: Mon, 10 Feb 2025 17:22:18 -0800 Subject: [PATCH 1/9] Initial log4j2 factory for dynamic configuration --- server/bootstrap/build.gradle | 16 +- .../LabKeyLog4j2ConfigurationFactory.java | 65 ++++ server/configs/application.properties | 2 + .../embedded/config/application.properties | 2 + server/embedded/build.gradle | 5 +- .../src/main/resources/configs/00.log4j2.xml | 342 ++++++++++++++++++ server/embedded/src/main/resources/log4j2.xml | 6 +- .../src/org/labkey/embedded/LabKeyServer.java | 1 + .../embedded/LabKeySpringBootClassLoader.java | 18 + 9 files changed, 452 insertions(+), 5 deletions(-) create mode 100644 server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java create mode 100644 server/embedded/src/main/resources/configs/00.log4j2.xml diff --git a/server/bootstrap/build.gradle b/server/bootstrap/build.gradle index c5fcb3e8e3..b5d344bbec 100644 --- a/server/bootstrap/build.gradle +++ b/server/bootstrap/build.gradle @@ -21,6 +21,20 @@ dependencies strictly "${apacheTomcatVersion}" } } + + // Allows forcing a Spring Framework version that differs from spring-boot's version (e.g., to address CVEs) + implementation('org.springframework:spring-web') { + version { + strictly "${springVersion}" + } + } + +// // Needed to support composite Log4j2 plugins using JSONLayout elements + implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}" +// +// runtimeOnly "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" +// implementation "commons-io:commons-io:${commonsIoVersion}" + implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}" } def JAR_BASE_NAME = "labkeyBootstrap" @@ -66,4 +80,4 @@ project.afterEvaluate { } } } -} \ No newline at end of file +} diff --git a/server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java b/server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java new file mode 100644 index 0000000000..c6b24e991e --- /dev/null +++ b/server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java @@ -0,0 +1,65 @@ +package org.labkey.bootstrap; + +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.AbstractConfiguration; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.ConfigurationFactory; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Order; +import org.apache.logging.log4j.core.config.composite.CompositeConfiguration; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.xml.XmlConfiguration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; + +import java.io.IOException; +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +@Plugin( + name = "LabKeyLog4j2ConfigurationFactory", + category = "ConfigurationFactory" +) +@Order(0) +public class LabKeyLog4j2ConfigurationFactory extends ConfigurationFactory +{ + @Override + public String[] getSupportedTypes() + { + return new String[]{".log4j2.xml",".xml", "*"}; + } + + @Override + public Configuration getConfiguration(final LoggerContext context, final ConfigurationSource source) { + List configs = new ArrayList<>(); + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader); + + // Use Ant-style patterns to match resources + Resource[] resources = null; + try + { + resources = resolver.getResources("classpath*:**/configs/*.log4j2.xml"); + for (Resource resource : resources) { + File config = resource.getFile(); + if (config.exists()) + { + ConfigurationSource cs = ConfigurationSource.fromUri(resource.getURI()); + XmlConfiguration xmlConfiguration = new XmlConfiguration(context, cs); + configs.add(xmlConfiguration); + } + } + + configs.sort(Comparator.comparing(AbstractConfiguration::getName)); + } + catch (IOException e) + { + throw new RuntimeException(e); + } + + return new CompositeConfiguration(configs); + } +} diff --git a/server/configs/application.properties b/server/configs/application.properties index a8f017dcbc..6191e5a06c 100644 --- a/server/configs/application.properties +++ b/server/configs/application.properties @@ -154,6 +154,8 @@ csp.report=\ ## Use a custom logging configuration #logging.config=path/to/alternative/log4j2.xml +#logging.config=classpath:01.log4j2.xml +#logging.log4j2.config.override=${LABKEY_HOME}/01.log4j2.xml ## File-based Tomcat HTTP access logs are enabled by default and use our recommended pattern. Override as needed. #server.tomcat.accesslog.enabled=false diff --git a/server/configs/webapps/embedded/config/application.properties b/server/configs/webapps/embedded/config/application.properties index 07a93674a8..58cb1f3e27 100644 --- a/server/configs/webapps/embedded/config/application.properties +++ b/server/configs/webapps/embedded/config/application.properties @@ -92,6 +92,8 @@ mail.smtpUser=Anonymous ## Use a custom logging configuration #logging.config=labkeywebapp/WEB-INF/classes/log4j2.xml +#logging.config=classpath:01.log4j2.xml +#logging.log4j2.config.override=${LABKEY_HOME}/01.log4j2.xml ## Enable tomcat access log #server.tomcat.accesslog.enabled=true diff --git a/server/embedded/build.gradle b/server/embedded/build.gradle index 943cf6b021..68c3c48403 100644 --- a/server/embedded/build.gradle +++ b/server/embedded/build.gradle @@ -36,6 +36,9 @@ configurations.configureEach { } dependencies { + // Needed to support composite Log4j2 plugins using JSONLayout elements + implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}" + implementation("org.springframework.boot:spring-boot-starter-web:${springBootVersion}") { exclude group: "org.springframework.boot", module: "spring-boot-starter-json" // Not used (?) and pulls in an old version of Jackson exclude group: "jakarta.annotation", module: "jakarta.annotation-api" // Already present in tomcat-annotations-api @@ -77,7 +80,7 @@ dependencies { runtimeOnly("org.apache.tomcat:tomcat-dbcp:${apacheTomcatVersion}") { exclude group: "org.apache.tomcat", module: "tomcat-juli" } - runtimeOnly "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" + implementation "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" implementation "commons-io:commons-io:${commonsIoVersion}" implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}" diff --git a/server/embedded/src/main/resources/configs/00.log4j2.xml b/server/embedded/src/main/resources/configs/00.log4j2.xml new file mode 100644 index 0000000000..47720e9c9e --- /dev/null +++ b/server/embedded/src/main/resources/configs/00.log4j2.xml @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n + + + + + + + + + + + + + + + %m%n + + + + + + + + + + + + %m%n + + + + + + + + + + + + %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n + + + + + + + + + + + %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n + + + + + + + + + + %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n + + + + + + + %d{yyyy-MM-dd HH:mm:ss}%m%n + + + + + + + + + + + %m%n + + + + + + + + + + + %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n + + + + + + + + + + + %d{ISO8601} %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/embedded/src/main/resources/log4j2.xml b/server/embedded/src/main/resources/log4j2.xml index ea674d04c7..030d079952 100644 --- a/server/embedded/src/main/resources/log4j2.xml +++ b/server/embedded/src/main/resources/log4j2.xml @@ -187,7 +187,7 @@ account managers so that we can coordinate edits with other customized copies of - + - + - + diff --git a/server/embedded/src/org/labkey/embedded/LabKeyServer.java b/server/embedded/src/org/labkey/embedded/LabKeyServer.java index 2b7aa79384..52f35e6ff3 100644 --- a/server/embedded/src/org/labkey/embedded/LabKeyServer.java +++ b/server/embedded/src/org/labkey/embedded/LabKeyServer.java @@ -44,6 +44,7 @@ public static void main(String[] args) embeddedExtractor.extractExecutableJar(currentDir, true); return; } + System.setProperty("log4j.configurationFactory", "org.labkey.bootstrap.LabKeyLog4j2ConfigurationFactory"); // Issue 40038: Ride-or-die Mode - default to shutting down by default in embedded deployment scenario if (System.getProperty(TERMINATE_ON_STARTUP_FAILURE) == null) diff --git a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java index 4f03b0d404..d493be433a 100644 --- a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java +++ b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java @@ -3,6 +3,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.labkey.bootstrap.LabKeyBootstrapClassLoader; +import org.labkey.bootstrap.LabKeyLog4j2ConfigurationFactory; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import java.io.IOException; import java.io.InputStream; @@ -64,6 +67,10 @@ protected boolean filter(String name, boolean isClassName) { return true; } +// else if (name.contains("LabKeyLog4j2ConfigurationFactory")) +// { +// return true; +// } return super.filter(name, isClassName); } @@ -98,4 +105,15 @@ public Enumeration getResources(String name) throws IOException } return super.getResources(name); } + + @Override + public Class loadClass(String name, boolean resolve) throws ClassNotFoundException + { + if (name.contains("LabKeyLog4j2ConfigurationFactory")) + { + return findSystemClass(name); + } + + return super.loadClass(name, resolve); + } } From 87731de636c79b81a156b8ea5cd71f9759e8dc5d Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 11 Feb 2025 08:46:02 -0800 Subject: [PATCH 2/9] Initial log4j2 factory for dynamic configuration --- server/bootstrap/build.gradle | 26 ++++---- .../bootstrap/LabKeyBootstrapClassLoader.java | 26 ++++++++ .../LabKeyLog4j2ConfigurationFactory.java | 65 ------------------- .../src/org/labkey/embedded/LabKeyServer.java | 1 - .../embedded/LabKeySpringBootClassLoader.java | 12 ---- 5 files changed, 39 insertions(+), 91 deletions(-) delete mode 100644 server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java diff --git a/server/bootstrap/build.gradle b/server/bootstrap/build.gradle index b5d344bbec..16ff716541 100644 --- a/server/bootstrap/build.gradle +++ b/server/bootstrap/build.gradle @@ -21,20 +21,20 @@ dependencies strictly "${apacheTomcatVersion}" } } - - // Allows forcing a Spring Framework version that differs from spring-boot's version (e.g., to address CVEs) - implementation('org.springframework:spring-web') { - version { - strictly "${springVersion}" - } - } - -// // Needed to support composite Log4j2 plugins using JSONLayout elements - implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}" // -// runtimeOnly "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" -// implementation "commons-io:commons-io:${commonsIoVersion}" - implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}" +// // Allows forcing a Spring Framework version that differs from spring-boot's version (e.g., to address CVEs) +// implementation('org.springframework:spring-web') { +// version { +// strictly "${springVersion}" +// } +// } +// +//// // Needed to support composite Log4j2 plugins using JSONLayout elements +// implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}" +//// +//// runtimeOnly "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" +//// implementation "commons-io:commons-io:${commonsIoVersion}" +// implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}" } def JAR_BASE_NAME = "labkeyBootstrap" diff --git a/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java b/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java index 905e43b8a2..d03678587d 100644 --- a/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java +++ b/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java @@ -55,6 +55,7 @@ public class LabKeyBootstrapClassLoader extends WebappClassLoader implements Exp String headless = "java.awt.headless"; if (System.getProperty(headless) == null) System.setProperty(headless, "true"); + System.setProperty("log4j.configurationFactory", "org.labkey.api.util.logging.LabKeyLog4j2ConfigurationFactory"); } private ModuleExtractor _moduleExtractor; @@ -383,4 +384,29 @@ public File getDeletedModulesDirectory() return deleted; } +// +// +// @Override +// public Class loadClass(String name, boolean resolve) throws ClassNotFoundException +// { +// if (name.contains("LabKeyLog4j2ConfigurationFactory")) +// { +// return findSystemClass(name); +//// return null; +// } +// +// return super.loadClass(name, resolve); +// } +// +// @Override +// public Class findClass(String name) throws ClassNotFoundException { +// if (name.contains("LabKeyLog4j2ConfigurationFactory")) +// { +// return findSystemClass(name); +//// return null; +// } +// +// return super.findClass(name); +// } + } diff --git a/server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java b/server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java deleted file mode 100644 index c6b24e991e..0000000000 --- a/server/bootstrap/src/org/labkey/bootstrap/LabKeyLog4j2ConfigurationFactory.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.labkey.bootstrap; - -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.AbstractConfiguration; -import org.apache.logging.log4j.core.config.Configuration; -import org.apache.logging.log4j.core.config.ConfigurationFactory; -import org.apache.logging.log4j.core.config.ConfigurationSource; -import org.apache.logging.log4j.core.config.Order; -import org.apache.logging.log4j.core.config.composite.CompositeConfiguration; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.xml.XmlConfiguration; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; - -import java.io.IOException; -import java.io.File; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -@Plugin( - name = "LabKeyLog4j2ConfigurationFactory", - category = "ConfigurationFactory" -) -@Order(0) -public class LabKeyLog4j2ConfigurationFactory extends ConfigurationFactory -{ - @Override - public String[] getSupportedTypes() - { - return new String[]{".log4j2.xml",".xml", "*"}; - } - - @Override - public Configuration getConfiguration(final LoggerContext context, final ConfigurationSource source) { - List configs = new ArrayList<>(); - - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader); - - // Use Ant-style patterns to match resources - Resource[] resources = null; - try - { - resources = resolver.getResources("classpath*:**/configs/*.log4j2.xml"); - for (Resource resource : resources) { - File config = resource.getFile(); - if (config.exists()) - { - ConfigurationSource cs = ConfigurationSource.fromUri(resource.getURI()); - XmlConfiguration xmlConfiguration = new XmlConfiguration(context, cs); - configs.add(xmlConfiguration); - } - } - - configs.sort(Comparator.comparing(AbstractConfiguration::getName)); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - - return new CompositeConfiguration(configs); - } -} diff --git a/server/embedded/src/org/labkey/embedded/LabKeyServer.java b/server/embedded/src/org/labkey/embedded/LabKeyServer.java index 52f35e6ff3..2b7aa79384 100644 --- a/server/embedded/src/org/labkey/embedded/LabKeyServer.java +++ b/server/embedded/src/org/labkey/embedded/LabKeyServer.java @@ -44,7 +44,6 @@ public static void main(String[] args) embeddedExtractor.extractExecutableJar(currentDir, true); return; } - System.setProperty("log4j.configurationFactory", "org.labkey.bootstrap.LabKeyLog4j2ConfigurationFactory"); // Issue 40038: Ride-or-die Mode - default to shutting down by default in embedded deployment scenario if (System.getProperty(TERMINATE_ON_STARTUP_FAILURE) == null) diff --git a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java index d493be433a..de2704797c 100644 --- a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java +++ b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java @@ -3,7 +3,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.labkey.bootstrap.LabKeyBootstrapClassLoader; -import org.labkey.bootstrap.LabKeyLog4j2ConfigurationFactory; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @@ -105,15 +104,4 @@ public Enumeration getResources(String name) throws IOException } return super.getResources(name); } - - @Override - public Class loadClass(String name, boolean resolve) throws ClassNotFoundException - { - if (name.contains("LabKeyLog4j2ConfigurationFactory")) - { - return findSystemClass(name); - } - - return super.loadClass(name, resolve); - } } From 0943174b5cbd891be635a663dd93ad574cbc36e1 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 11 Feb 2025 08:49:38 -0800 Subject: [PATCH 3/9] Clean up class loader --- .../bootstrap/LabKeyBootstrapClassLoader.java | 27 ++----------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java b/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java index d03678587d..8593b324f5 100644 --- a/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java +++ b/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java @@ -55,6 +55,8 @@ public class LabKeyBootstrapClassLoader extends WebappClassLoader implements Exp String headless = "java.awt.headless"; if (System.getProperty(headless) == null) System.setProperty(headless, "true"); + + // Initialize the Log4j Composite Configuration factory System.setProperty("log4j.configurationFactory", "org.labkey.api.util.logging.LabKeyLog4j2ConfigurationFactory"); } @@ -384,29 +386,4 @@ public File getDeletedModulesDirectory() return deleted; } -// -// -// @Override -// public Class loadClass(String name, boolean resolve) throws ClassNotFoundException -// { -// if (name.contains("LabKeyLog4j2ConfigurationFactory")) -// { -// return findSystemClass(name); -//// return null; -// } -// -// return super.loadClass(name, resolve); -// } -// -// @Override -// public Class findClass(String name) throws ClassNotFoundException { -// if (name.contains("LabKeyLog4j2ConfigurationFactory")) -// { -// return findSystemClass(name); -//// return null; -// } -// -// return super.findClass(name); -// } - } From 106b86060fa13ac3f3b3254665117210df20edef Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 11 Feb 2025 08:51:47 -0800 Subject: [PATCH 4/9] clean up some scraps --- server/bootstrap/build.gradle | 14 -------------- .../embedded/LabKeySpringBootClassLoader.java | 4 ---- 2 files changed, 18 deletions(-) diff --git a/server/bootstrap/build.gradle b/server/bootstrap/build.gradle index 16ff716541..b023f18f86 100644 --- a/server/bootstrap/build.gradle +++ b/server/bootstrap/build.gradle @@ -21,20 +21,6 @@ dependencies strictly "${apacheTomcatVersion}" } } -// -// // Allows forcing a Spring Framework version that differs from spring-boot's version (e.g., to address CVEs) -// implementation('org.springframework:spring-web') { -// version { -// strictly "${springVersion}" -// } -// } -// -//// // Needed to support composite Log4j2 plugins using JSONLayout elements -// implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}" -//// -//// runtimeOnly "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" -//// implementation "commons-io:commons-io:${commonsIoVersion}" -// implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}" } def JAR_BASE_NAME = "labkeyBootstrap" diff --git a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java index de2704797c..a34ae5d9d1 100644 --- a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java +++ b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java @@ -66,10 +66,6 @@ protected boolean filter(String name, boolean isClassName) { return true; } -// else if (name.contains("LabKeyLog4j2ConfigurationFactory")) -// { -// return true; -// } return super.filter(name, isClassName); } From 589867c79621ee019f54ae858e11ab2fb0e23c23 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 11 Feb 2025 16:27:36 -0800 Subject: [PATCH 5/9] Clean up and add comments --- server/configs/application.properties | 5 +++-- .../configs/webapps/embedded/config/application.properties | 5 +++-- .../src/org/labkey/embedded/LabKeySpringBootClassLoader.java | 2 -- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/configs/application.properties b/server/configs/application.properties index 6191e5a06c..6a2eeb2744 100644 --- a/server/configs/application.properties +++ b/server/configs/application.properties @@ -154,8 +154,9 @@ csp.report=\ ## Use a custom logging configuration #logging.config=path/to/alternative/log4j2.xml -#logging.config=classpath:01.log4j2.xml -#logging.log4j2.config.override=${LABKEY_HOME}/01.log4j2.xml + +## Alternative method to override Log4J2 with a composite configuration, later in the list overrides any shared nodes +#logging.log4j2.config.override=classpath:config/00.log4j2.xml,classpath:config/01.log4j2.xml ## File-based Tomcat HTTP access logs are enabled by default and use our recommended pattern. Override as needed. #server.tomcat.accesslog.enabled=false diff --git a/server/configs/webapps/embedded/config/application.properties b/server/configs/webapps/embedded/config/application.properties index 58cb1f3e27..d58d70d77d 100644 --- a/server/configs/webapps/embedded/config/application.properties +++ b/server/configs/webapps/embedded/config/application.properties @@ -92,8 +92,9 @@ mail.smtpUser=Anonymous ## Use a custom logging configuration #logging.config=labkeywebapp/WEB-INF/classes/log4j2.xml -#logging.config=classpath:01.log4j2.xml -#logging.log4j2.config.override=${LABKEY_HOME}/01.log4j2.xml + +## Alternative method to override Log4J2 with a composite configuration, later in the list overrides any shared nodes +#logging.log4j2.config.override=classpath:config/00.log4j2.xml,classpath:config/01.log4j2.xml ## Enable tomcat access log #server.tomcat.accesslog.enabled=true diff --git a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java index a34ae5d9d1..4f03b0d404 100644 --- a/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java +++ b/server/embedded/src/org/labkey/embedded/LabKeySpringBootClassLoader.java @@ -3,8 +3,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.labkey.bootstrap.LabKeyBootstrapClassLoader; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import java.io.IOException; import java.io.InputStream; From 31cede442543b8415e7e67a0858761268fc58738 Mon Sep 17 00:00:00 2001 From: ian Date: Fri, 21 Feb 2025 12:24:35 -0800 Subject: [PATCH 6/9] Bump spring version Exclude commson-logging to remove warning --- gradle.properties | 2 +- server/embedded/build.gradle | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index cf904a2c9f..2609019cb1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -291,7 +291,7 @@ snappyJavaVersion=1.1.10.7 # Also, update apacheTomcatVersion above to match Spring Boot's Tomcat dependency version springBootVersion=3.4.1 # This usually matches the Spring Framework version dictated by springBootVersion -springVersion=6.2.1 +springVersion=6.2.3 sqliteJdbcVersion=3.48.0.0 diff --git a/server/embedded/build.gradle b/server/embedded/build.gradle index 68c3c48403..8c01df0a60 100644 --- a/server/embedded/build.gradle +++ b/server/embedded/build.gradle @@ -80,7 +80,10 @@ dependencies { runtimeOnly("org.apache.tomcat:tomcat-dbcp:${apacheTomcatVersion}") { exclude group: "org.apache.tomcat", module: "tomcat-juli" } - implementation "org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}" + implementation ("org.apache.logging.log4j:log4j-slf4j2-impl:${log4j2Version}") { + exclude group: 'commons-logging', module: 'commons-logging' + } + implementation "commons-io:commons-io:${commonsIoVersion}" implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}" From 794c05811fd3304aa2ce2a861f0f3d62091c6508 Mon Sep 17 00:00:00 2001 From: ian Date: Wed, 5 Mar 2025 11:02:30 -0800 Subject: [PATCH 7/9] Couldn't get the ConfigurationFactory to play nice with the docker container. Switching to a different strategy. --- .../bootstrap/LabKeyBootstrapClassLoader.java | 3 - .../src/main/resources/configs/00.log4j2.xml | 342 ------------------ 2 files changed, 345 deletions(-) delete mode 100644 server/embedded/src/main/resources/configs/00.log4j2.xml diff --git a/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java b/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java index 8593b324f5..905e43b8a2 100644 --- a/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java +++ b/server/bootstrap/src/org/labkey/bootstrap/LabKeyBootstrapClassLoader.java @@ -55,9 +55,6 @@ public class LabKeyBootstrapClassLoader extends WebappClassLoader implements Exp String headless = "java.awt.headless"; if (System.getProperty(headless) == null) System.setProperty(headless, "true"); - - // Initialize the Log4j Composite Configuration factory - System.setProperty("log4j.configurationFactory", "org.labkey.api.util.logging.LabKeyLog4j2ConfigurationFactory"); } private ModuleExtractor _moduleExtractor; diff --git a/server/embedded/src/main/resources/configs/00.log4j2.xml b/server/embedded/src/main/resources/configs/00.log4j2.xml deleted file mode 100644 index 47720e9c9e..0000000000 --- a/server/embedded/src/main/resources/configs/00.log4j2.xml +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - - - - - %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n - - - - - - - - - - - - - - - %m%n - - - - - - - - - - - - %m%n - - - - - - - - - - - - %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n - - - - - - - - - - - %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n - - - - - - - - - - %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n - - - - - - - %d{yyyy-MM-dd HH:mm:ss}%m%n - - - - - - - - - - - %m%n - - - - - - - - - - - %-5p %-24.24c{1} %d{ISO8601} %24.24t : %m%n - - - - - - - - - - - %d{ISO8601} %m%n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From f53867808b393e70dce7f817e8e2eec73f24de46 Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 6 Mar 2025 14:52:38 -0800 Subject: [PATCH 8/9] Remove example log4j properties --- server/configs/application.properties | 3 --- server/configs/webapps/embedded/config/application.properties | 3 --- 2 files changed, 6 deletions(-) diff --git a/server/configs/application.properties b/server/configs/application.properties index 6a2eeb2744..a8f017dcbc 100644 --- a/server/configs/application.properties +++ b/server/configs/application.properties @@ -155,9 +155,6 @@ csp.report=\ ## Use a custom logging configuration #logging.config=path/to/alternative/log4j2.xml -## Alternative method to override Log4J2 with a composite configuration, later in the list overrides any shared nodes -#logging.log4j2.config.override=classpath:config/00.log4j2.xml,classpath:config/01.log4j2.xml - ## File-based Tomcat HTTP access logs are enabled by default and use our recommended pattern. Override as needed. #server.tomcat.accesslog.enabled=false #server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %S %I "%{Referer}i" "%{User-Agent}i" %{LABKEY.username}s %{X-Forwarded-For}i diff --git a/server/configs/webapps/embedded/config/application.properties b/server/configs/webapps/embedded/config/application.properties index d58d70d77d..07a93674a8 100644 --- a/server/configs/webapps/embedded/config/application.properties +++ b/server/configs/webapps/embedded/config/application.properties @@ -93,9 +93,6 @@ mail.smtpUser=Anonymous ## Use a custom logging configuration #logging.config=labkeywebapp/WEB-INF/classes/log4j2.xml -## Alternative method to override Log4J2 with a composite configuration, later in the list overrides any shared nodes -#logging.log4j2.config.override=classpath:config/00.log4j2.xml,classpath:config/01.log4j2.xml - ## Enable tomcat access log #server.tomcat.accesslog.enabled=true #server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %S %I "%{Referrer}i" "%{User-Agent}i" %{LABKEY.username}s From 6c952bf037a708834dacb8464924177e91fbeeb7 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 11 Mar 2025 16:45:26 -0700 Subject: [PATCH 9/9] Remove level --- server/embedded/src/main/resources/log4j2.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/embedded/src/main/resources/log4j2.xml b/server/embedded/src/main/resources/log4j2.xml index 030d079952..ea674d04c7 100644 --- a/server/embedded/src/main/resources/log4j2.xml +++ b/server/embedded/src/main/resources/log4j2.xml @@ -187,7 +187,7 @@ account managers so that we can coordinate edits with other customized copies of - + - + - +