This is an automated email from the ASF dual-hosted git repository.

pkarwasz pushed a commit to branch fix/3871_graalvm-filter
in repository https://gitbox.apache.org/repos/asf/logging-log4j-samples.git

commit 92e911520e7cf94e66320489816d64b5f77892eb
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Thu Dec 11 17:51:23 2025 +0100

    Reproduce `ThresholdFilter` GraalVM issue
    
    This change reproduces the issue described in apache/logging-log4j2#3871, 
where configurations that include `ThresholdFilter` (or any other Log4j filter) 
fail to work correctly when building a GraalVM native image.
    
    The root cause is a mismatch in how parameter types are represented in 
`reflect-config.json`:
    
    * The existing metadata stores parameter types using their canonical class 
name (JLS §6.7).
    * However, GraalVM expects the binary class name (JLS §13.1).
      This is especially relevant for nested types:
    
      * Canonical name: `org.apache.logging.log4j.core.Filter.Result`
      * Binary name: `org.apache.logging.log4j.core.Filter$Result`
    * For array types, GraalVM accepts either:
    
      * the JVM descriptor form (`[L<component_type>;`), or
      * the Java-like form (`<component_type>[]`).
    
    This PR introduces tests that intentionally fail for the `log4j-core` and 
`log4j-core-jtl` profiles, because they rely on the embedded reachability 
metadata in Log4j Core, which currently uses canonical names.
    In contrast, the `log4j-core-minimal` and `log4j-core-jtl-minimal` profiles 
rely on manually generated metadata, which has been updated in this PR to use 
the expected binary names and now works correctly under GraalVM.
---
 .../src/main/resources/log4j2-jtl.xml                 |   8 ++++++++
 log4j-samples-graalvm/src/main/resources/log4j2.xml   |   8 ++++++++
 .../log4j-core-jtl-minimal/Log4j2Plugins.json         |   9 +++++++++
 .../log4j-core/reflect-config.json                    |  16 +++++++++++++++-
 .../log4j/core/config/plugins/Log4j2Plugins.dat       | Bin 6630 -> 6711 bytes
 .../log4j-core-minimal/Log4j2Plugins.json             |   9 +++++++++
 .../log4j-core/reflect-config.json                    |  16 +++++++++++++++-
 .../log4j/core/config/plugins/Log4j2Plugins.dat       | Bin 8517 -> 8598 bytes
 .../log4j/samples/graalvm/JsonTemplateLayoutIT.java   |   2 +-
 .../logging/log4j/samples/graalvm/StandardIT.java     |   2 +-
 10 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/log4j-samples-graalvm/src/main/resources/log4j2-jtl.xml 
b/log4j-samples-graalvm/src/main/resources/log4j2-jtl.xml
index b313231..38d6097 100644
--- a/log4j-samples-graalvm/src/main/resources/log4j2-jtl.xml
+++ b/log4j-samples-graalvm/src/main/resources/log4j2-jtl.xml
@@ -26,6 +26,14 @@
   </Appenders>
   <Loggers>
     <Root level="TRACE">
+      <!--
+        Added solely to verify the reachability-metadata regression (issue 
#3871).
+        This configuration is not intended for production use: relying on 
ThresholdFilter
+        instead of the more efficient built-in level checks is discouraged.
+
+        See: https://github.com/apache/logging-log4j2/issues/3871
+      -->
+      <ThresholdFilter level="DEBUG"/>
       <AppenderRef ref="FILE"/>
     </Root>
   </Loggers>
diff --git a/log4j-samples-graalvm/src/main/resources/log4j2.xml 
b/log4j-samples-graalvm/src/main/resources/log4j2.xml
index 03a9c22..1e2be3f 100644
--- a/log4j-samples-graalvm/src/main/resources/log4j2.xml
+++ b/log4j-samples-graalvm/src/main/resources/log4j2.xml
@@ -26,6 +26,14 @@
   </Appenders>
   <Loggers>
     <Root level="TRACE">
+      <!--
+        Added solely to verify the reachability-metadata regression (issue 
#3871).
+        This configuration is not intended for production use: relying on 
ThresholdFilter
+        instead of the more efficient built-in level checks is discouraged.
+
+        See: https://github.com/apache/logging-log4j2/issues/3871
+      -->
+      <ThresholdFilter level="DEBUG"/>
       <AppenderRef ref="FILE"/>
     </Root>
   </Loggers>
diff --git 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/Log4j2Plugins.json
 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/Log4j2Plugins.json
index 7812f6f..97cad07 100644
--- 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/Log4j2Plugins.json
+++ 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/Log4j2Plugins.json
@@ -110,6 +110,15 @@
       "builderHierarchy": [
         
"org.apache.logging.log4j.layout.template.json.JsonTemplateLayout$EventTemplateAdditionalField$Builder"
       ]
+    },
+    "org.apache.logging.log4j.core.filter.ThresholdFilter": {
+      "pluginNames": [
+        "thresholdfilter"
+      ],
+      "elementName": "filter",
+      "printable": true,
+      "defer": false,
+      "builderHierarchy": []
     }
   },
   "jsontemplateresolverfactory": {
diff --git 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
index d36bb91..0b7844e 100644
--- 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
+++ 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
@@ -628,5 +628,19 @@
         "name": "propertyArray"
       }
     ]
+  },
+  {
+    "name": "org.apache.logging.log4j.core.filter.ThresholdFilter",
+    "methods": [
+      {
+        "name": "createFilter",
+        "parameterTypes": [
+          "org.apache.logging.log4j.Level",
+          "org.apache.logging.log4j.core.Filter$Result",
+          "org.apache.logging.log4j.core.Filter$Result"
+        ]
+      }
+    ],
+    "fields": []
   }
-]
\ No newline at end of file
+]
diff --git 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
index ac9efe0..a1201b7 100644
Binary files 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
 and 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-jtl-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
 differ
diff --git 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/Log4j2Plugins.json
 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/Log4j2Plugins.json
index 6da7a86..4fb44b5 100644
--- 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/Log4j2Plugins.json
+++ 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/Log4j2Plugins.json
@@ -506,6 +506,15 @@
       "builderHierarchy": [
         "org.apache.logging.log4j.core.layout.PatternLayout$Builder"
       ]
+    },
+    "org.apache.logging.log4j.core.filter.ThresholdFilter": {
+      "pluginNames": [
+        "thresholdfilter"
+      ],
+      "elementName": "filter",
+      "printable": true,
+      "defer": false,
+      "builderHierarchy": []
     }
   },
   "typeconverter": {
diff --git 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
index e9991af..4b2c518 100644
--- 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
+++ 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/native-image/org.apache.logging.log4j/log4j-core/reflect-config.json
@@ -1316,5 +1316,19 @@
       }
     ],
     "fields": []
+  },
+  {
+    "name": "org.apache.logging.log4j.core.filter.ThresholdFilter",
+    "methods": [
+      {
+        "name": "createFilter",
+        "parameterTypes": [
+          "org.apache.logging.log4j.Level",
+          "org.apache.logging.log4j.core.Filter$Result",
+          "org.apache.logging.log4j.core.Filter$Result"
+        ]
+      }
+    ],
+    "fields": []
   }
-]
\ No newline at end of file
+]
diff --git 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
index c81c04b..6d4a979 100644
Binary files 
a/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
 and 
b/log4j-samples-graalvm/src/reachability-metadata/log4j-core-minimal/resources/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
 differ
diff --git 
a/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/JsonTemplateLayoutIT.java
 
b/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/JsonTemplateLayoutIT.java
index 48a05c1..ba160a7 100644
--- 
a/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/JsonTemplateLayoutIT.java
+++ 
b/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/JsonTemplateLayoutIT.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.Test;
  */
 class JsonTemplateLayoutIT {
 
-    static final String[] STANDARD_LEVELS = {"ERROR", "WARN", "INFO", "DEBUG", 
"TRACE"};
+    static final String[] STANDARD_LEVELS = {"ERROR", "WARN", "INFO", "DEBUG"};
 
     @Test
     void verifyStdOut() {
diff --git 
a/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/StandardIT.java
 
b/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/StandardIT.java
index ccb5744..088e4ea 100644
--- 
a/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/StandardIT.java
+++ 
b/log4j-samples-graalvm/src/test/java/org/apache/logging/log4j/samples/graalvm/StandardIT.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.Test;
  */
 class StandardIT {
 
-    static final String[] STANDARD_LEVELS = {"ERROR", "WARN", "INFO", "DEBUG", 
"TRACE"};
+    static final String[] STANDARD_LEVELS = {"ERROR", "WARN", "INFO", "DEBUG"};
 
     @Test
     void verifyStdOut() {

Reply via email to