From a487a5d029697fc0b276a20c4277b24bf1f66b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Sat, 2 May 2026 18:50:10 +0200 Subject: [PATCH 01/23] Tidy up changelog --- .../.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml | 3 +-- src/changelog/.2.x.x/3750_deprecate_withers.xml | 3 ++- src/changelog/.2.x.x/3819_logback-builder-reuse.xml | 2 +- .../.2.x.x/3828_fix_log_placeholder_mismatch.xml | 2 +- src/changelog/.2.x.x/3835-default-layout.xml | 2 +- src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml | 3 +-- src/changelog/.2.x.x/3920-nested-throwables.xml | 2 +- src/changelog/.2.x.x/3930_date-converter.xml | 2 +- ...eStackTraceRenderer_ArrayIndexOutOfBoundsException.xml | 2 +- .../3975_prevent_warning_for_last_null_argument.xml | 3 +-- .../.2.x.x/4033_fix_custom_throwable_to_sting.xml | 2 +- .../.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml | 3 ++- src/changelog/.2.x.x/4099_javadoc-cross-link.xml | 2 +- .../add_debug_logs_for_successful_resource_loading.xml | 2 +- .../add_getConfiguration_method_for_mulitiple_URIs.xml | 6 +++--- .../fix_RollingRandomAccessFileManager_writeHeader.xml | 2 +- .../.2.x.x/prevent_configexception_non_used_config.xml | 4 ++-- src/changelog/.2.x.x/rfc5424-setters.xml | 2 +- .../update_co_elastic_clients_elasticsearch_java.xml | 8 -------- .../.2.x.x/update_org_apache_commons_commons_lang3.xml | 8 -------- ...te_org_gradlex_gradle_module_metadata_maven_plugin.xml | 8 -------- 21 files changed, 23 insertions(+), 48 deletions(-) delete mode 100644 src/changelog/.2.x.x/update_co_elastic_clients_elasticsearch_java.xml delete mode 100644 src/changelog/.2.x.x/update_org_apache_commons_commons_lang3.xml delete mode 100644 src/changelog/.2.x.x/update_org_gradlex_gradle_module_metadata_maven_plugin.xml diff --git a/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml b/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml index 0246396937d..db263d3b4c9 100644 --- a/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml +++ b/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml @@ -7,7 +7,6 @@ type="changed"> - Ensured scripts in global `Scripts container` have explicit names by throwing a `ConfigurationException` for unnamed ones. - Refined script identification with `AbstractScript.getId()` and clarified `AbstractScript.getName()`. + Ensure scripts in the global `Scripts` element have explicit names by throwing a `ConfigurationException` for unnamed ones. diff --git a/src/changelog/.2.x.x/3750_deprecate_withers.xml b/src/changelog/.2.x.x/3750_deprecate_withers.xml index f7084c2719b..e691f0ce4ee 100644 --- a/src/changelog/.2.x.x/3750_deprecate_withers.xml +++ b/src/changelog/.2.x.x/3750_deprecate_withers.xml @@ -7,6 +7,7 @@ type="deprecated"> - Deprecated withers in builder classes in favor of setters. This change improves API consistency with 3.x and helps users adapt to the upcoming changes. + Deprecated withers in builder classes in favor of setters. + This change improves API consistency with Log4j Core 3 and helps users adapt to the upcoming changes. diff --git a/src/changelog/.2.x.x/3819_logback-builder-reuse.xml b/src/changelog/.2.x.x/3819_logback-builder-reuse.xml index ea67aa50d04..39361aa122c 100644 --- a/src/changelog/.2.x.x/3819_logback-builder-reuse.xml +++ b/src/changelog/.2.x.x/3819_logback-builder-reuse.xml @@ -7,6 +7,6 @@ type="fixed"> - Fix potential memory leak involving `LogBuilder` in Log4j API to Logback bridge. + Fix potential memory leak involving `LogBuilder` in Log4j API to Logback bridge diff --git a/src/changelog/.2.x.x/3828_fix_log_placeholder_mismatch.xml b/src/changelog/.2.x.x/3828_fix_log_placeholder_mismatch.xml index 884b93985d9..2e73ba053c7 100644 --- a/src/changelog/.2.x.x/3828_fix_log_placeholder_mismatch.xml +++ b/src/changelog/.2.x.x/3828_fix_log_placeholder_mismatch.xml @@ -7,6 +7,6 @@ type="fixed"> - Corrected an incorrect placeholder count in the AbstractDriverManagerConnectionSource debug log message to prevent unnecessary warnings. + Fix the incorrect placeholder count in `AbstractDriverManagerConnectionSource` debug log message to prevent unnecessary warnings diff --git a/src/changelog/.2.x.x/3835-default-layout.xml b/src/changelog/.2.x.x/3835-default-layout.xml index 877631c9028..99474e08444 100644 --- a/src/changelog/.2.x.x/3835-default-layout.xml +++ b/src/changelog/.2.x.x/3835-default-layout.xml @@ -7,6 +7,6 @@ type="fixed"> - Fix missing newlines in default logging configuration for log4j-core. + Fix missing newlines in default logging configuration for `log4j-core` diff --git a/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml b/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml index ef0c2850bed..6e0551af5f2 100644 --- a/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml +++ b/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml @@ -5,8 +5,7 @@ https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="removed"> - - + Remove the `jvmrunargs` lookup. diff --git a/src/changelog/.2.x.x/3920-nested-throwables.xml b/src/changelog/.2.x.x/3920-nested-throwables.xml index a8c9b13cfe3..63bcdead3a2 100644 --- a/src/changelog/.2.x.x/3920-nested-throwables.xml +++ b/src/changelog/.2.x.x/3920-nested-throwables.xml @@ -7,6 +7,6 @@ type="fixed"> - Fix detection of throwable converters inside nested patterns when applying `alwaysWriteExceptions`. + Fix detection of throwable converters inside nested patterns when applying `alwaysWriteExceptions` diff --git a/src/changelog/.2.x.x/3930_date-converter.xml b/src/changelog/.2.x.x/3930_date-converter.xml index 1823ea9602d..5d961a32021 100644 --- a/src/changelog/.2.x.x/3930_date-converter.xml +++ b/src/changelog/.2.x.x/3930_date-converter.xml @@ -7,6 +7,6 @@ type="fixed"> - Fix parsing and merging of literals in `InstantPatternDynamicFormatter`. + Fix parsing and merging of literals in `InstantPatternDynamicFormatter` diff --git a/src/changelog/.2.x.x/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml b/src/changelog/.2.x.x/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml index 4bd5ca2c281..cc0058776fb 100644 --- a/src/changelog/.2.x.x/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml +++ b/src/changelog/.2.x.x/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml @@ -8,6 +8,6 @@ - Fixes `ArrayIndexOutOfBoundsException` thrown by `ThrowableStackTraceRenderer` when the stack trace is mutated concurrently. + Fix `ArrayIndexOutOfBoundsException` thrown by `ThrowableStackTraceRenderer` when the stack trace is modified concurrently diff --git a/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml b/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml index 9c96386facd..8af5e3ebbb9 100644 --- a/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml +++ b/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml @@ -8,7 +8,6 @@ - Prevent ParameterFormatter issuing a warning in case there is an extra null argument. - Needed to support cases with Throwable parameter that may be null. + Prevent `ParameterFormatter` from issuing a warning in case there is an extra null argument diff --git a/src/changelog/.2.x.x/4033_fix_custom_throwable_to_sting.xml b/src/changelog/.2.x.x/4033_fix_custom_throwable_to_sting.xml index 761380f81c1..0097393de27 100644 --- a/src/changelog/.2.x.x/4033_fix_custom_throwable_to_sting.xml +++ b/src/changelog/.2.x.x/4033_fix_custom_throwable_to_sting.xml @@ -8,6 +8,6 @@ - Take `Throwable#toString()` into account while rendering stack traces in Pattern Layout. + Take `Throwable#toString()` into account while rendering stack traces in Pattern Layout diff --git a/src/changelog/.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml b/src/changelog/.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml index 811996eb8d5..f2dcb095374 100644 --- a/src/changelog/.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml +++ b/src/changelog/.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml @@ -8,6 +8,7 @@ - Fixed `SLF4JLogger.atFatal()` returning `atLevel(Level.TRACE)` instead of `atLevel(Level.FATAL)`, which caused FATAL log events to be silently discarded when using the fluent API through the `log4j-to-slf4j` bridge. + Fix `SLF4JLogger.atFatal()` returning `atLevel(Level.TRACE)` instead of `atLevel(Level.FATAL)`. + This was causing `FATAL`-level log events to be silently discarded when using the fluent API through the `log4j-to-slf4j` bridge. diff --git a/src/changelog/.2.x.x/4099_javadoc-cross-link.xml b/src/changelog/.2.x.x/4099_javadoc-cross-link.xml index 86e02a96a16..5110576866a 100644 --- a/src/changelog/.2.x.x/4099_javadoc-cross-link.xml +++ b/src/changelog/.2.x.x/4099_javadoc-cross-link.xml @@ -8,6 +8,6 @@ - Javadoc references across module boundaries (i.e., cross-references) are fixed + Fix Javadoc references across module boundaries (i.e., cross-references) diff --git a/src/changelog/.2.x.x/add_debug_logs_for_successful_resource_loading.xml b/src/changelog/.2.x.x/add_debug_logs_for_successful_resource_loading.xml index 445100bf51a..2fec650fbd1 100644 --- a/src/changelog/.2.x.x/add_debug_logs_for_successful_resource_loading.xml +++ b/src/changelog/.2.x.x/add_debug_logs_for_successful_resource_loading.xml @@ -8,6 +8,6 @@ - Added debug level logs for successful resource loading in `Loader` class to show where resources are found + Add debug level logs for successful resource loading in `Loader` class to show where resources are found diff --git a/src/changelog/.2.x.x/add_getConfiguration_method_for_mulitiple_URIs.xml b/src/changelog/.2.x.x/add_getConfiguration_method_for_mulitiple_URIs.xml index 6a30033ce68..a6b84f92922 100644 --- a/src/changelog/.2.x.x/add_getConfiguration_method_for_mulitiple_URIs.xml +++ b/src/changelog/.2.x.x/add_getConfiguration_method_for_mulitiple_URIs.xml @@ -1,10 +1,10 @@ + type="added"> diff --git a/src/changelog/.2.x.x/fix_RollingRandomAccessFileManager_writeHeader.xml b/src/changelog/.2.x.x/fix_RollingRandomAccessFileManager_writeHeader.xml index a23c6497f92..0cf87573c7d 100644 --- a/src/changelog/.2.x.x/fix_RollingRandomAccessFileManager_writeHeader.xml +++ b/src/changelog/.2.x.x/fix_RollingRandomAccessFileManager_writeHeader.xml @@ -6,7 +6,7 @@ https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="fixed"> - Fix header write in `RollingRandomAccessFileManager` that was being incorrectly skipped if `append=true` and the file didn't exist before. + Fix header write in `RollingRandomAccessFileManager` that was being incorrectly skipped if `append=true` and the file didn't exist before diff --git a/src/changelog/.2.x.x/prevent_configexception_non_used_config.xml b/src/changelog/.2.x.x/prevent_configexception_non_used_config.xml index b489fa0e247..ed774ce2571 100644 --- a/src/changelog/.2.x.x/prevent_configexception_non_used_config.xml +++ b/src/changelog/.2.x.x/prevent_configexception_non_used_config.xml @@ -4,10 +4,10 @@ xsi:schemaLocation=" https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" - type="added"> + type="fixed"> - Disregarded defined logger, appender and filter properties not referenced in loggers, appenders and filters respectively + Fix a properties file configuration regression caused by not referenced loggers, appenders, and filters diff --git a/src/changelog/.2.x.x/rfc5424-setters.xml b/src/changelog/.2.x.x/rfc5424-setters.xml index 4cd3cde7329..6ad576b69f2 100644 --- a/src/changelog/.2.x.x/rfc5424-setters.xml +++ b/src/changelog/.2.x.x/rfc5424-setters.xml @@ -6,6 +6,6 @@ https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="added"> - Add missing setters to `Rfc5424LayoutBuilder`. + Add missing setters to `Rfc5424LayoutBuilder` diff --git a/src/changelog/.2.x.x/update_co_elastic_clients_elasticsearch_java.xml b/src/changelog/.2.x.x/update_co_elastic_clients_elasticsearch_java.xml deleted file mode 100644 index a2f7650479c..00000000000 --- a/src/changelog/.2.x.x/update_co_elastic_clients_elasticsearch_java.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Update `co.elastic.clients:elasticsearch-java` to version `9.1.5` - diff --git a/src/changelog/.2.x.x/update_org_apache_commons_commons_lang3.xml b/src/changelog/.2.x.x/update_org_apache_commons_commons_lang3.xml deleted file mode 100644 index 33e9b853863..00000000000 --- a/src/changelog/.2.x.x/update_org_apache_commons_commons_lang3.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Update `org.apache.commons:commons-lang3` to version `3.18.0` - diff --git a/src/changelog/.2.x.x/update_org_gradlex_gradle_module_metadata_maven_plugin.xml b/src/changelog/.2.x.x/update_org_gradlex_gradle_module_metadata_maven_plugin.xml deleted file mode 100644 index a1d201d9a72..00000000000 --- a/src/changelog/.2.x.x/update_org_gradlex_gradle_module_metadata_maven_plugin.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Update `org.gradlex:gradle-module-metadata-maven-plugin` to version `1.1` - From 0e019f23b001219fd32c78397224b134fa41e431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Sat, 2 May 2026 18:54:06 +0200 Subject: [PATCH 02/23] Move changelog entries --- .../{.2.x.x => 2.26.0}/3176_validate_scripts_in_ScriptsPlugin.xml | 0 .../{.2.x.x => 2.26.0}/3336_script_resolution_order_fix.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3750_deprecate_withers.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3819_logback-builder-reuse.xml | 0 .../{.2.x.x => 2.26.0}/3828_fix_log_placeholder_mismatch.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3835-default-layout.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3852-default-target.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3871_graalvm_binary_name.xml | 0 .../3872_fix_RollingFileManager_initialTime.xml | 0 .../{.2.x.x => 2.26.0}/3873_throwable_converter_new_line.xml | 0 .../{.2.x.x => 2.26.0}/3874_remove_jvmrunargs_lookup.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3905_fix_error_prone_dep.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3920-nested-throwables.xml | 0 src/changelog/{.2.x.x => 2.26.0}/3930_date-converter.xml | 0 .../3935_optimize_DefaultThreadContextMap_getCopy.xml | 0 ...ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml | 0 .../3947_fix_SslSocketManager_null_keystore.xml | 0 .../{.2.x.x => 2.26.0}/3968_refactor_manager_factories.xml | 0 .../3975_prevent_warning_for_last_null_argument.xml | 0 .../{.2.x.x => 2.26.0}/3985_remove_spotbugs_annotations.xml | 0 .../4002_fix_SslSocketAppender_verifyHostName.xml | 0 .../{.2.x.x => 2.26.0}/4033_fix_custom_throwable_to_sting.xml | 0 .../4068_fix_SLF4JLogger_atFatal_wrong_level.xml | 0 src/changelog/{.2.x.x => 2.26.0}/4099_javadoc-cross-link.xml | 0 .../add_debug_logs_for_successful_resource_loading.xml | 0 .../add_getConfiguration_method_for_mulitiple_URIs.xml | 0 .../exported_named_patterns_into_public_enum.xml | 0 .../fix_RollingRandomAccessFileManager_writeHeader.xml | 0 .../plugin_processor_min_allowed_message_kind.xml | 0 .../prevent_configexception_non_used_config.xml | 0 src/changelog/{.2.x.x => 2.26.0}/rfc5424-setters.xml | 0 src/changelog/{.2.x.x => 2.26.0}/update_org_junit_junit_bom.xml | 0 src/changelog/{.2.x.x => 2.26.0}/update_org_mongodb_bson.xml | 0 .../{.2.x.x => 2.26.0}/update_org_xerial_snappy_snappy_java.xml | 0 34 files changed, 0 insertions(+), 0 deletions(-) rename src/changelog/{.2.x.x => 2.26.0}/3176_validate_scripts_in_ScriptsPlugin.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3336_script_resolution_order_fix.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3750_deprecate_withers.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3819_logback-builder-reuse.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3828_fix_log_placeholder_mismatch.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3835-default-layout.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3852-default-target.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3871_graalvm_binary_name.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3872_fix_RollingFileManager_initialTime.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3873_throwable_converter_new_line.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3874_remove_jvmrunargs_lookup.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3905_fix_error_prone_dep.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3920-nested-throwables.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3930_date-converter.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3935_optimize_DefaultThreadContextMap_getCopy.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3947_fix_SslSocketManager_null_keystore.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3968_refactor_manager_factories.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3975_prevent_warning_for_last_null_argument.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/3985_remove_spotbugs_annotations.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/4002_fix_SslSocketAppender_verifyHostName.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/4033_fix_custom_throwable_to_sting.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/4068_fix_SLF4JLogger_atFatal_wrong_level.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/4099_javadoc-cross-link.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/add_debug_logs_for_successful_resource_loading.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/add_getConfiguration_method_for_mulitiple_URIs.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/exported_named_patterns_into_public_enum.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/fix_RollingRandomAccessFileManager_writeHeader.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/plugin_processor_min_allowed_message_kind.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/prevent_configexception_non_used_config.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/rfc5424-setters.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/update_org_junit_junit_bom.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/update_org_mongodb_bson.xml (100%) rename src/changelog/{.2.x.x => 2.26.0}/update_org_xerial_snappy_snappy_java.xml (100%) diff --git a/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml b/src/changelog/2.26.0/3176_validate_scripts_in_ScriptsPlugin.xml similarity index 100% rename from src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml rename to src/changelog/2.26.0/3176_validate_scripts_in_ScriptsPlugin.xml diff --git a/src/changelog/.2.x.x/3336_script_resolution_order_fix.xml b/src/changelog/2.26.0/3336_script_resolution_order_fix.xml similarity index 100% rename from src/changelog/.2.x.x/3336_script_resolution_order_fix.xml rename to src/changelog/2.26.0/3336_script_resolution_order_fix.xml diff --git a/src/changelog/.2.x.x/3750_deprecate_withers.xml b/src/changelog/2.26.0/3750_deprecate_withers.xml similarity index 100% rename from src/changelog/.2.x.x/3750_deprecate_withers.xml rename to src/changelog/2.26.0/3750_deprecate_withers.xml diff --git a/src/changelog/.2.x.x/3819_logback-builder-reuse.xml b/src/changelog/2.26.0/3819_logback-builder-reuse.xml similarity index 100% rename from src/changelog/.2.x.x/3819_logback-builder-reuse.xml rename to src/changelog/2.26.0/3819_logback-builder-reuse.xml diff --git a/src/changelog/.2.x.x/3828_fix_log_placeholder_mismatch.xml b/src/changelog/2.26.0/3828_fix_log_placeholder_mismatch.xml similarity index 100% rename from src/changelog/.2.x.x/3828_fix_log_placeholder_mismatch.xml rename to src/changelog/2.26.0/3828_fix_log_placeholder_mismatch.xml diff --git a/src/changelog/.2.x.x/3835-default-layout.xml b/src/changelog/2.26.0/3835-default-layout.xml similarity index 100% rename from src/changelog/.2.x.x/3835-default-layout.xml rename to src/changelog/2.26.0/3835-default-layout.xml diff --git a/src/changelog/.2.x.x/3852-default-target.xml b/src/changelog/2.26.0/3852-default-target.xml similarity index 100% rename from src/changelog/.2.x.x/3852-default-target.xml rename to src/changelog/2.26.0/3852-default-target.xml diff --git a/src/changelog/.2.x.x/3871_graalvm_binary_name.xml b/src/changelog/2.26.0/3871_graalvm_binary_name.xml similarity index 100% rename from src/changelog/.2.x.x/3871_graalvm_binary_name.xml rename to src/changelog/2.26.0/3871_graalvm_binary_name.xml diff --git a/src/changelog/.2.x.x/3872_fix_RollingFileManager_initialTime.xml b/src/changelog/2.26.0/3872_fix_RollingFileManager_initialTime.xml similarity index 100% rename from src/changelog/.2.x.x/3872_fix_RollingFileManager_initialTime.xml rename to src/changelog/2.26.0/3872_fix_RollingFileManager_initialTime.xml diff --git a/src/changelog/.2.x.x/3873_throwable_converter_new_line.xml b/src/changelog/2.26.0/3873_throwable_converter_new_line.xml similarity index 100% rename from src/changelog/.2.x.x/3873_throwable_converter_new_line.xml rename to src/changelog/2.26.0/3873_throwable_converter_new_line.xml diff --git a/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml b/src/changelog/2.26.0/3874_remove_jvmrunargs_lookup.xml similarity index 100% rename from src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml rename to src/changelog/2.26.0/3874_remove_jvmrunargs_lookup.xml diff --git a/src/changelog/.2.x.x/3905_fix_error_prone_dep.xml b/src/changelog/2.26.0/3905_fix_error_prone_dep.xml similarity index 100% rename from src/changelog/.2.x.x/3905_fix_error_prone_dep.xml rename to src/changelog/2.26.0/3905_fix_error_prone_dep.xml diff --git a/src/changelog/.2.x.x/3920-nested-throwables.xml b/src/changelog/2.26.0/3920-nested-throwables.xml similarity index 100% rename from src/changelog/.2.x.x/3920-nested-throwables.xml rename to src/changelog/2.26.0/3920-nested-throwables.xml diff --git a/src/changelog/.2.x.x/3930_date-converter.xml b/src/changelog/2.26.0/3930_date-converter.xml similarity index 100% rename from src/changelog/.2.x.x/3930_date-converter.xml rename to src/changelog/2.26.0/3930_date-converter.xml diff --git a/src/changelog/.2.x.x/3935_optimize_DefaultThreadContextMap_getCopy.xml b/src/changelog/2.26.0/3935_optimize_DefaultThreadContextMap_getCopy.xml similarity index 100% rename from src/changelog/.2.x.x/3935_optimize_DefaultThreadContextMap_getCopy.xml rename to src/changelog/2.26.0/3935_optimize_DefaultThreadContextMap_getCopy.xml diff --git a/src/changelog/.2.x.x/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml b/src/changelog/2.26.0/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml similarity index 100% rename from src/changelog/.2.x.x/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml rename to src/changelog/2.26.0/3940_ThrowableStackTraceRenderer_ArrayIndexOutOfBoundsException.xml diff --git a/src/changelog/.2.x.x/3947_fix_SslSocketManager_null_keystore.xml b/src/changelog/2.26.0/3947_fix_SslSocketManager_null_keystore.xml similarity index 100% rename from src/changelog/.2.x.x/3947_fix_SslSocketManager_null_keystore.xml rename to src/changelog/2.26.0/3947_fix_SslSocketManager_null_keystore.xml diff --git a/src/changelog/.2.x.x/3968_refactor_manager_factories.xml b/src/changelog/2.26.0/3968_refactor_manager_factories.xml similarity index 100% rename from src/changelog/.2.x.x/3968_refactor_manager_factories.xml rename to src/changelog/2.26.0/3968_refactor_manager_factories.xml diff --git a/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml b/src/changelog/2.26.0/3975_prevent_warning_for_last_null_argument.xml similarity index 100% rename from src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml rename to src/changelog/2.26.0/3975_prevent_warning_for_last_null_argument.xml diff --git a/src/changelog/.2.x.x/3985_remove_spotbugs_annotations.xml b/src/changelog/2.26.0/3985_remove_spotbugs_annotations.xml similarity index 100% rename from src/changelog/.2.x.x/3985_remove_spotbugs_annotations.xml rename to src/changelog/2.26.0/3985_remove_spotbugs_annotations.xml diff --git a/src/changelog/.2.x.x/4002_fix_SslSocketAppender_verifyHostName.xml b/src/changelog/2.26.0/4002_fix_SslSocketAppender_verifyHostName.xml similarity index 100% rename from src/changelog/.2.x.x/4002_fix_SslSocketAppender_verifyHostName.xml rename to src/changelog/2.26.0/4002_fix_SslSocketAppender_verifyHostName.xml diff --git a/src/changelog/.2.x.x/4033_fix_custom_throwable_to_sting.xml b/src/changelog/2.26.0/4033_fix_custom_throwable_to_sting.xml similarity index 100% rename from src/changelog/.2.x.x/4033_fix_custom_throwable_to_sting.xml rename to src/changelog/2.26.0/4033_fix_custom_throwable_to_sting.xml diff --git a/src/changelog/.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml b/src/changelog/2.26.0/4068_fix_SLF4JLogger_atFatal_wrong_level.xml similarity index 100% rename from src/changelog/.2.x.x/4068_fix_SLF4JLogger_atFatal_wrong_level.xml rename to src/changelog/2.26.0/4068_fix_SLF4JLogger_atFatal_wrong_level.xml diff --git a/src/changelog/.2.x.x/4099_javadoc-cross-link.xml b/src/changelog/2.26.0/4099_javadoc-cross-link.xml similarity index 100% rename from src/changelog/.2.x.x/4099_javadoc-cross-link.xml rename to src/changelog/2.26.0/4099_javadoc-cross-link.xml diff --git a/src/changelog/.2.x.x/add_debug_logs_for_successful_resource_loading.xml b/src/changelog/2.26.0/add_debug_logs_for_successful_resource_loading.xml similarity index 100% rename from src/changelog/.2.x.x/add_debug_logs_for_successful_resource_loading.xml rename to src/changelog/2.26.0/add_debug_logs_for_successful_resource_loading.xml diff --git a/src/changelog/.2.x.x/add_getConfiguration_method_for_mulitiple_URIs.xml b/src/changelog/2.26.0/add_getConfiguration_method_for_mulitiple_URIs.xml similarity index 100% rename from src/changelog/.2.x.x/add_getConfiguration_method_for_mulitiple_URIs.xml rename to src/changelog/2.26.0/add_getConfiguration_method_for_mulitiple_URIs.xml diff --git a/src/changelog/.2.x.x/exported_named_patterns_into_public_enum.xml b/src/changelog/2.26.0/exported_named_patterns_into_public_enum.xml similarity index 100% rename from src/changelog/.2.x.x/exported_named_patterns_into_public_enum.xml rename to src/changelog/2.26.0/exported_named_patterns_into_public_enum.xml diff --git a/src/changelog/.2.x.x/fix_RollingRandomAccessFileManager_writeHeader.xml b/src/changelog/2.26.0/fix_RollingRandomAccessFileManager_writeHeader.xml similarity index 100% rename from src/changelog/.2.x.x/fix_RollingRandomAccessFileManager_writeHeader.xml rename to src/changelog/2.26.0/fix_RollingRandomAccessFileManager_writeHeader.xml diff --git a/src/changelog/.2.x.x/plugin_processor_min_allowed_message_kind.xml b/src/changelog/2.26.0/plugin_processor_min_allowed_message_kind.xml similarity index 100% rename from src/changelog/.2.x.x/plugin_processor_min_allowed_message_kind.xml rename to src/changelog/2.26.0/plugin_processor_min_allowed_message_kind.xml diff --git a/src/changelog/.2.x.x/prevent_configexception_non_used_config.xml b/src/changelog/2.26.0/prevent_configexception_non_used_config.xml similarity index 100% rename from src/changelog/.2.x.x/prevent_configexception_non_used_config.xml rename to src/changelog/2.26.0/prevent_configexception_non_used_config.xml diff --git a/src/changelog/.2.x.x/rfc5424-setters.xml b/src/changelog/2.26.0/rfc5424-setters.xml similarity index 100% rename from src/changelog/.2.x.x/rfc5424-setters.xml rename to src/changelog/2.26.0/rfc5424-setters.xml diff --git a/src/changelog/.2.x.x/update_org_junit_junit_bom.xml b/src/changelog/2.26.0/update_org_junit_junit_bom.xml similarity index 100% rename from src/changelog/.2.x.x/update_org_junit_junit_bom.xml rename to src/changelog/2.26.0/update_org_junit_junit_bom.xml diff --git a/src/changelog/.2.x.x/update_org_mongodb_bson.xml b/src/changelog/2.26.0/update_org_mongodb_bson.xml similarity index 100% rename from src/changelog/.2.x.x/update_org_mongodb_bson.xml rename to src/changelog/2.26.0/update_org_mongodb_bson.xml diff --git a/src/changelog/.2.x.x/update_org_xerial_snappy_snappy_java.xml b/src/changelog/2.26.0/update_org_xerial_snappy_snappy_java.xml similarity index 100% rename from src/changelog/.2.x.x/update_org_xerial_snappy_snappy_java.xml rename to src/changelog/2.26.0/update_org_xerial_snappy_snappy_java.xml From def55fcf441b2a9ec2e6454e8fa8e1053d7d59ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Sat, 2 May 2026 19:07:50 +0200 Subject: [PATCH 03/23] Add `.release.xml` and `.release-notes.adoc.ftl` --- src/changelog/2.26.0/.release-notes.adoc.ftl | 25 ++++++++++++++++++++ src/changelog/2.26.0/.release.xml | 21 ++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/changelog/2.26.0/.release-notes.adoc.ftl create mode 100644 src/changelog/2.26.0/.release.xml diff --git a/src/changelog/2.26.0/.release-notes.adoc.ftl b/src/changelog/2.26.0/.release-notes.adoc.ftl new file mode 100644 index 00000000000..a8872ea1964 --- /dev/null +++ b/src/changelog/2.26.0/.release-notes.adoc.ftl @@ -0,0 +1,25 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +[${'#release-notes-' + release.version?replace("[^a-zA-Z0-9]", "-", "r")}] +== ${release.version} + +<#if release.date?has_content>Release date:: ${release.date} + +This minor release delivers all the fixes in the `[2.25.0, 2.25.4]` version range, plus some new fixes, and several other improvements and features. + +<#include "../.changelog.adoc.ftl"> diff --git a/src/changelog/2.26.0/.release.xml b/src/changelog/2.26.0/.release.xml new file mode 100644 index 00000000000..6bd483477d7 --- /dev/null +++ b/src/changelog/2.26.0/.release.xml @@ -0,0 +1,21 @@ + + + From 23321deb0e1e1509ac16c5453653c86c1a4d5867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Sat, 2 May 2026 20:23:49 +0200 Subject: [PATCH 04/23] Remove changelog entries for already released changes --- .../2.26.0/3819_logback-builder-reuse.xml | 12 ------------ .../2.26.0/3828_fix_log_placeholder_mismatch.xml | 12 ------------ src/changelog/2.26.0/3835-default-layout.xml | 12 ------------ src/changelog/2.26.0/3852-default-target.xml | 12 ------------ src/changelog/2.26.0/3871_graalvm_binary_name.xml | 13 ------------- .../3872_fix_RollingFileManager_initialTime.xml | 13 ------------- .../2.26.0/3873_throwable_converter_new_line.xml | 13 ------------- src/changelog/2.26.0/3905_fix_error_prone_dep.xml | 14 -------------- src/changelog/2.26.0/3920-nested-throwables.xml | 12 ------------ src/changelog/2.26.0/3930_date-converter.xml | 12 ------------ ...35_optimize_DefaultThreadContextMap_getCopy.xml | 13 ------------- .../3947_fix_SslSocketManager_null_keystore.xml | 13 ------------- ...3975_prevent_warning_for_last_null_argument.xml | 13 ------------- .../2.26.0/3985_remove_spotbugs_annotations.xml | 13 ------------- .../4002_fix_SslSocketAppender_verifyHostName.xml | 12 ------------ .../2.26.0/4033_fix_custom_throwable_to_sting.xml | 13 ------------- ..._debug_logs_for_successful_resource_loading.xml | 13 ------------- 17 files changed, 215 deletions(-) delete mode 100644 src/changelog/2.26.0/3819_logback-builder-reuse.xml delete mode 100644 src/changelog/2.26.0/3828_fix_log_placeholder_mismatch.xml delete mode 100644 src/changelog/2.26.0/3835-default-layout.xml delete mode 100644 src/changelog/2.26.0/3852-default-target.xml delete mode 100644 src/changelog/2.26.0/3871_graalvm_binary_name.xml delete mode 100644 src/changelog/2.26.0/3872_fix_RollingFileManager_initialTime.xml delete mode 100644 src/changelog/2.26.0/3873_throwable_converter_new_line.xml delete mode 100644 src/changelog/2.26.0/3905_fix_error_prone_dep.xml delete mode 100644 src/changelog/2.26.0/3920-nested-throwables.xml delete mode 100644 src/changelog/2.26.0/3930_date-converter.xml delete mode 100644 src/changelog/2.26.0/3935_optimize_DefaultThreadContextMap_getCopy.xml delete mode 100644 src/changelog/2.26.0/3947_fix_SslSocketManager_null_keystore.xml delete mode 100644 src/changelog/2.26.0/3975_prevent_warning_for_last_null_argument.xml delete mode 100644 src/changelog/2.26.0/3985_remove_spotbugs_annotations.xml delete mode 100644 src/changelog/2.26.0/4002_fix_SslSocketAppender_verifyHostName.xml delete mode 100644 src/changelog/2.26.0/4033_fix_custom_throwable_to_sting.xml delete mode 100644 src/changelog/2.26.0/add_debug_logs_for_successful_resource_loading.xml diff --git a/src/changelog/2.26.0/3819_logback-builder-reuse.xml b/src/changelog/2.26.0/3819_logback-builder-reuse.xml deleted file mode 100644 index 39361aa122c..00000000000 --- a/src/changelog/2.26.0/3819_logback-builder-reuse.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix potential memory leak involving `LogBuilder` in Log4j API to Logback bridge - - diff --git a/src/changelog/2.26.0/3828_fix_log_placeholder_mismatch.xml b/src/changelog/2.26.0/3828_fix_log_placeholder_mismatch.xml deleted file mode 100644 index 2e73ba053c7..00000000000 --- a/src/changelog/2.26.0/3828_fix_log_placeholder_mismatch.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix the incorrect placeholder count in `AbstractDriverManagerConnectionSource` debug log message to prevent unnecessary warnings - - diff --git a/src/changelog/2.26.0/3835-default-layout.xml b/src/changelog/2.26.0/3835-default-layout.xml deleted file mode 100644 index 99474e08444..00000000000 --- a/src/changelog/2.26.0/3835-default-layout.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix missing newlines in default logging configuration for `log4j-core` - - diff --git a/src/changelog/2.26.0/3852-default-target.xml b/src/changelog/2.26.0/3852-default-target.xml deleted file mode 100644 index ec4c28297d3..00000000000 --- a/src/changelog/2.26.0/3852-default-target.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix missing default `Target` value in Console Appender. - - diff --git a/src/changelog/2.26.0/3871_graalvm_binary_name.xml b/src/changelog/2.26.0/3871_graalvm_binary_name.xml deleted file mode 100644 index a6a5e8c2573..00000000000 --- a/src/changelog/2.26.0/3871_graalvm_binary_name.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Fix GraalVM metadata for nested classes to use binary names instead of canonical names. - - diff --git a/src/changelog/2.26.0/3872_fix_RollingFileManager_initialTime.xml b/src/changelog/2.26.0/3872_fix_RollingFileManager_initialTime.xml deleted file mode 100644 index ba6fbd91294..00000000000 --- a/src/changelog/2.26.0/3872_fix_RollingFileManager_initialTime.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Discard the sub-second part while obtaining the initial time (i.e., creation time) of a file in `RollingFileManager` - - diff --git a/src/changelog/2.26.0/3873_throwable_converter_new_line.xml b/src/changelog/2.26.0/3873_throwable_converter_new_line.xml deleted file mode 100644 index 30011263e52..00000000000 --- a/src/changelog/2.26.0/3873_throwable_converter_new_line.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Fix Pattern Layout exception stack trace converters to no longer prepend newlines based on context - - diff --git a/src/changelog/2.26.0/3905_fix_error_prone_dep.xml b/src/changelog/2.26.0/3905_fix_error_prone_dep.xml deleted file mode 100644 index 2667e0f4245..00000000000 --- a/src/changelog/2.26.0/3905_fix_error_prone_dep.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Fix the `com.google.errorprone:error_prone_annotations` dependency whose version property gets erased due to flattening - - diff --git a/src/changelog/2.26.0/3920-nested-throwables.xml b/src/changelog/2.26.0/3920-nested-throwables.xml deleted file mode 100644 index 63bcdead3a2..00000000000 --- a/src/changelog/2.26.0/3920-nested-throwables.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix detection of throwable converters inside nested patterns when applying `alwaysWriteExceptions` - - diff --git a/src/changelog/2.26.0/3930_date-converter.xml b/src/changelog/2.26.0/3930_date-converter.xml deleted file mode 100644 index 5d961a32021..00000000000 --- a/src/changelog/2.26.0/3930_date-converter.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix parsing and merging of literals in `InstantPatternDynamicFormatter` - - diff --git a/src/changelog/2.26.0/3935_optimize_DefaultThreadContextMap_getCopy.xml b/src/changelog/2.26.0/3935_optimize_DefaultThreadContextMap_getCopy.xml deleted file mode 100644 index 35e1cf8b444..00000000000 --- a/src/changelog/2.26.0/3935_optimize_DefaultThreadContextMap_getCopy.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Optimize `DefaultThreadContextMap.getCopy()` performance by avoiding megamorphic calls in `HashMap` constructor - - \ No newline at end of file diff --git a/src/changelog/2.26.0/3947_fix_SslSocketManager_null_keystore.xml b/src/changelog/2.26.0/3947_fix_SslSocketManager_null_keystore.xml deleted file mode 100644 index ff6efe8256f..00000000000 --- a/src/changelog/2.26.0/3947_fix_SslSocketManager_null_keystore.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Fix failures caused by null `SslConfiguration` - - diff --git a/src/changelog/2.26.0/3975_prevent_warning_for_last_null_argument.xml b/src/changelog/2.26.0/3975_prevent_warning_for_last_null_argument.xml deleted file mode 100644 index 8af5e3ebbb9..00000000000 --- a/src/changelog/2.26.0/3975_prevent_warning_for_last_null_argument.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Prevent `ParameterFormatter` from issuing a warning in case there is an extra null argument - - diff --git a/src/changelog/2.26.0/3985_remove_spotbugs_annotations.xml b/src/changelog/2.26.0/3985_remove_spotbugs_annotations.xml deleted file mode 100644 index a2c7b3b8b20..00000000000 --- a/src/changelog/2.26.0/3985_remove_spotbugs_annotations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Remove the `com.github.spotbugs:spotbugs-annotations` dependency - - diff --git a/src/changelog/2.26.0/4002_fix_SslSocketAppender_verifyHostName.xml b/src/changelog/2.26.0/4002_fix_SslSocketAppender_verifyHostName.xml deleted file mode 100644 index 9fb4e40c88e..00000000000 --- a/src/changelog/2.26.0/4002_fix_SslSocketAppender_verifyHostName.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Fix incorrect handling of the host name verification (i.e., `verifyHostName`) in `SslSocketManager`, which is used by Socket Appender when SSL/TLS is enabled - - diff --git a/src/changelog/2.26.0/4033_fix_custom_throwable_to_sting.xml b/src/changelog/2.26.0/4033_fix_custom_throwable_to_sting.xml deleted file mode 100644 index 0097393de27..00000000000 --- a/src/changelog/2.26.0/4033_fix_custom_throwable_to_sting.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Take `Throwable#toString()` into account while rendering stack traces in Pattern Layout - - diff --git a/src/changelog/2.26.0/add_debug_logs_for_successful_resource_loading.xml b/src/changelog/2.26.0/add_debug_logs_for_successful_resource_loading.xml deleted file mode 100644 index 2fec650fbd1..00000000000 --- a/src/changelog/2.26.0/add_debug_logs_for_successful_resource_loading.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Add debug level logs for successful resource loading in `Loader` class to show where resources are found - - From 8b3a7990421ec5cff2a44914c07d0676067c31ad Mon Sep 17 00:00:00 2001 From: ASF Logging Services RM Date: Sat, 2 May 2026 19:54:56 +0000 Subject: [PATCH 05/23] Set version to `2.26.0` --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4020b4b427d..69f4b16d794 100644 --- a/pom.xml +++ b/pom.xml @@ -307,7 +307,7 @@ - 2.26.0-SNAPSHOT + 2.26.0 2.25.4 2.25.4 From 39517e0656f9dc12fc2a0965ea8708da13dc79d8 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Thu, 11 Jun 2026 17:45:03 +0530 Subject: [PATCH 06/23] Fix stack trace rendering for exceptions with identity malfunction (#4133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix circular reference detection for exceptions with colliding equals/hashCode implementations * Add changelog entry for circular reference detection fix with colliding equals/hashCode exceptions * Add changelog entry for circular reference detection fix with colliding equals/hashCode exceptions * Add test for ThrowableProxy serialization with colliding equals/hashCode implementations * Refactor ThrowableProxy serialization test to use modern Java I/O classes * Use `TestFriendlyException` to exercise the malfunction * Update changelog * Improve comments * Remove redundant change --------- Co-authored-by: Volkan Yazıcı --- .../test/java/foo/TestFriendlyException.java | 76 +++++++++++++++++-- .../log4j/core/impl/ThrowableProxy.java | 14 +++- .../pattern/ThrowableStackTraceRenderer.java | 16 ++-- ...etection-for-exceptions-with-colliding.xml | 13 ++++ 4 files changed, 104 insertions(+), 15 deletions(-) create mode 100644 src/changelog/.2.x.x/fix-circular-reference-detection-for-exceptions-with-colliding.xml diff --git a/log4j-core-test/src/test/java/foo/TestFriendlyException.java b/log4j-core-test/src/test/java/foo/TestFriendlyException.java index 7c791dc20d2..c024db10aed 100644 --- a/log4j-core-test/src/test/java/foo/TestFriendlyException.java +++ b/log4j-core-test/src/test/java/foo/TestFriendlyException.java @@ -20,6 +20,12 @@ import java.net.Socket; import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; import java.util.stream.Stream; import org.apache.logging.log4j.util.Constants; @@ -33,6 +39,7 @@ *
  • Suppressed exceptions
  • *
  • Clutter-free stack trace (i.e., elements from JUnit, JDK, etc.)
  • *
  • Stack trace elements from named modules3
  • + *
  • Exceptions with malfunctioning (e.g., colliding) {@link Object#equals(Object) equals()} and {@link Object#hashCode() hashCode()} implementations in the causal chain
  • * *

    * 1 Helps with observing stack trace manipulation effects of Log4j. @@ -80,20 +87,63 @@ private static StackTraceElement namedModuleStackTraceElement() { "java.lang", "jdk.internal", "org.junit", "sun.reflect" }; - public static final TestFriendlyException INSTANCE = create("r", 0, 2, new boolean[] {false}, new boolean[] {true}); + public static final TestFriendlyException INSTANCE = + create("r", 0, 2, new boolean[] {false}, new boolean[] {true}, new int[] {5}); + + static { + ensureIdentityMalfunctionAtDifferentDepths(); + } + + /** + * Ensure we have identity malfunctioning exceptions that have different stack trace lengths. + * + * @see #3933 + */ + private static void ensureIdentityMalfunctionAtDifferentDepths() { + final Set visitedExceptions = Collections.newSetFromMap(new IdentityHashMap<>()); + final Set identityMalfunctioningExceptionStackTraceDepths = new HashSet<>(); + final Queue exceptions = new LinkedList<>(); + exceptions.add(INSTANCE); + while (!exceptions.isEmpty()) { + + // Process the exception + final TestFriendlyException exception = exceptions.remove(); + if (!visitedExceptions.add(exception) || !exception.identityMalfunctioning) { + continue; + } + identityMalfunctioningExceptionStackTraceDepths.add(exception.getStackTrace().length); + + // Enqueue the cause + final TestFriendlyException cause = (TestFriendlyException) exception.getCause(); + if (cause != null) { + exceptions.add(cause); + } + + // Enqueue the suppressed + for (final Throwable suppressed : exception.getSuppressed()) { + exceptions.add((TestFriendlyException) suppressed); + } + } + assertThat(identityMalfunctioningExceptionStackTraceDepths) + .describedAs("# of visited exceptions = %s", visitedExceptions.size()) + .hasSizeGreaterThan(1); + } private static TestFriendlyException create( final String name, final int depth, final int maxDepth, final boolean[] circular, - final boolean[] namedModuleAllowed) { - final TestFriendlyException error = new TestFriendlyException(name, namedModuleAllowed); + final boolean[] namedModuleAllowed, + final int[] maxIdentityMalfunctionCount) { + final TestFriendlyException error = + new TestFriendlyException(name, namedModuleAllowed, maxIdentityMalfunctionCount); if (depth < maxDepth) { - final TestFriendlyException cause = create(name + "_c", depth + 1, maxDepth, circular, namedModuleAllowed); + final TestFriendlyException cause = + create(name + "_c", depth + 1, maxDepth, circular, namedModuleAllowed, maxIdentityMalfunctionCount); error.initCause(cause); final TestFriendlyException suppressed = - create(name + "_s", depth + 1, maxDepth, circular, namedModuleAllowed); + create(name + "_s", depth + 1, maxDepth, circular, namedModuleAllowed, maxIdentityMalfunctionCount); error.addSuppressed(suppressed); final boolean circularAllowed = depth + 1 == maxDepth && !circular[0]; if (circularAllowed) { @@ -105,8 +155,12 @@ private static TestFriendlyException create( return error; } - private TestFriendlyException(final String message, final boolean[] namedModuleAllowed) { + private final boolean identityMalfunctioning; + + private TestFriendlyException( + final String message, final boolean[] namedModuleAllowed, final int[] maxIdentityMalfunctionCount) { super(message); + this.identityMalfunctioning = --maxIdentityMalfunctionCount[0] > 0; removeExcludedStackTraceElements(namedModuleAllowed); } @@ -171,4 +225,14 @@ private static Stream namedModuleIncludedStackTraceElement(fi public String getLocalizedMessage() { return getMessage() + " [localized]"; } + + @Override + public int hashCode() { + return identityMalfunctioning ? 0 : super.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return identityMalfunctioning || super.equals(obj); + } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java index 61d292dc487..d051a4fc206 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java @@ -18,9 +18,10 @@ import java.io.Serializable; import java.util.Arrays; +import java.util.Collections; import java.util.Deque; import java.util.HashMap; -import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -113,11 +114,16 @@ public ThrowableProxy(final Throwable throwable) { this.extendedStackTrace = ThrowableProxyHelper.toExtendedStackTrace(this, stack, map, null, throwable.getStackTrace()); final Throwable throwableCause = throwable.getCause(); - final Set causeVisited = new HashSet<>(1); + // `IdentityHashMap` is needed for exceptions with identity malfunction. + // Consider `equals()` and `hashCode()` implementations causing collisions. + final Set causeVisited = Collections.newSetFromMap(new IdentityHashMap<>(1)); + final Set suppressedVisited = + visited == null ? Collections.newSetFromMap(new IdentityHashMap<>()) : visited; + this.causeProxy = throwableCause == null ? null - : new ThrowableProxy(throwable, stack, map, throwableCause, visited, causeVisited); - this.suppressedProxies = ThrowableProxyHelper.toSuppressedProxies(throwable, visited); + : new ThrowableProxy(throwable, stack, map, throwableCause, suppressedVisited, causeVisited); + this.suppressedProxies = ThrowableProxyHelper.toSuppressedProxies(throwable, suppressedVisited); } /** diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowableStackTraceRenderer.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowableStackTraceRenderer.java index 4d210213213..cafb2a2a936 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowableStackTraceRenderer.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowableStackTraceRenderer.java @@ -16,8 +16,8 @@ */ package org.apache.logging.log4j.core.pattern; -import java.util.HashMap; -import java.util.HashSet; +import java.util.Collections; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -53,7 +53,10 @@ public final void renderThrowable( if (maxLineCount > 0) { try { C context = createContext(throwable); - renderThrowable(buffer, throwable, context, new HashSet<>(), lineSeparator); + // `IdentityHashMap` is needed for exceptions with identity malfunction. + // Consider `equals()` and `hashCode()` implementations causing collisions. + final Set visitedThrowables = Collections.newSetFromMap(new IdentityHashMap<>()); + renderThrowable(buffer, throwable, context, visitedThrowables, lineSeparator); } catch (final Exception error) { if (error != MAX_LINE_COUNT_EXCEEDED) { throw error; @@ -292,8 +295,11 @@ private Metadata( } static Map ofThrowable(final Throwable throwable) { - final Map metadataByThrowable = new HashMap<>(); - populateMetadata(metadataByThrowable, new HashSet<>(), null, throwable); + // `IdentityHashMap` is needed for exceptions with identity malfunction. + // Consider `equals()` and `hashCode()` implementations causing collisions. + final Map metadataByThrowable = new IdentityHashMap<>(); + final Set visitedThrowables = Collections.newSetFromMap(new IdentityHashMap<>()); + populateMetadata(metadataByThrowable, visitedThrowables, null, throwable); return metadataByThrowable; } diff --git a/src/changelog/.2.x.x/fix-circular-reference-detection-for-exceptions-with-colliding.xml b/src/changelog/.2.x.x/fix-circular-reference-detection-for-exceptions-with-colliding.xml new file mode 100644 index 00000000000..1633dcdb8ab --- /dev/null +++ b/src/changelog/.2.x.x/fix-circular-reference-detection-for-exceptions-with-colliding.xml @@ -0,0 +1,13 @@ + + + + + + Fix stack trace rendering for exceptions with identity malfunction (e.g., colliding `equals()` and/or `hashCode()` implementations) + + From b655e6ab84b1f46123deeef5adae5230d2bbe352 Mon Sep 17 00:00:00 2001 From: Sebastien Tardif Date: Mon, 15 Jun 2026 00:03:57 -0700 Subject: [PATCH 07/23] Fix resource leaks in `ConfigurationSource` when loading via URL (#4127) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sebastien Tardif Co-authored-by: Ramanathan Co-authored-by: Piotr P. Karwasz Co-authored-by: Volkan Yazıcı --- .../core/config/ConfigurationSourceTest.java | 94 +++++++++++++++++++ .../core/config/ConfigurationSource.java | 51 ++++++---- .../fix_configuration_source_url_leak.xml | 8 ++ 3 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 src/changelog/.2.x.x/fix_configuration_source_url_leak.xml diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ConfigurationSourceTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ConfigurationSourceTest.java index 3015f4f6271..9df40fcc4e6 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ConfigurationSourceTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ConfigurationSourceTest.java @@ -25,14 +25,22 @@ import com.sun.management.UnixOperatingSystemMXBean; import java.io.ByteArrayInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; +import java.lang.reflect.Method; +import java.net.HttpURLConnection; +import java.net.URI; import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; import java.nio.file.Files; import java.nio.file.Path; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; @@ -104,6 +112,92 @@ void testLoadConfigurationSourceFromJarFile() throws Exception { } } + /** + * Verifies that a failed JAR configuration load (missing entry) does not leak file descriptors + * or hold a lock on the JAR file. + */ + @Test + void testJarFileLeakOnFailure() throws Exception { + final Path jarFile = prepareJarConfigURL(tempDir); + final String jarUriStr = "jar:" + jarFile.toUri().toASCIIString() + "!/" + java.util.UUID.randomUUID(); + final URI jarUri = URI.create(jarUriStr); + + final long expectedFdCount = getOpenFileDescriptorCount(); + + assertNull(ConfigurationSource.fromUri(jarUri)); + + assertEquals(expectedFdCount, getOpenFileDescriptorCount()); + Files.delete(jarFile); + } + + /** + * Verifies that the error-path cleanup in {@code getConfigurationSource} + * properly disconnects an {@link HttpURLConnection} on failure without + * calling {@link URLConnection#getInputStream()} a second time. + */ + @Test + void getConfigurationSource_disconnectsHttpConnection_onError() throws Exception { + final AtomicInteger getInputStreamCalls = new AtomicInteger(); + final AtomicBoolean disconnected = new AtomicBoolean(); + final AtomicInteger openConnectionCalls = new AtomicInteger(); + + final URLStreamHandler handler = new URLStreamHandler() { + @Override + protected URLConnection openConnection(final URL u) { + openConnectionCalls.incrementAndGet(); + return new HttpURLConnection(u) { + @Override + public InputStream getInputStream() throws IOException { + getInputStreamCalls.incrementAndGet(); + throw new FileNotFoundException("Mocked 404"); + } + + @Override + public void disconnect() { + disconnected.set(true); + } + + @Override + public boolean usingProxy() { + return false; + } + + @Override + public void connect() {} + }; + } + }; + + final URL url = new URL("http", "example.com", 80, "/missing.xml", handler); + + // Allow the "http" protocol for this test. + final String propKey = "log4j2.Configuration.allowedProtocols"; + final String previous = System.getProperty(propKey); + System.setProperty(propKey, "file, https, jar, http"); + try { + openConnectionCalls.set(0); + getInputStreamCalls.set(0); + + final Method method = ConfigurationSource.class.getDeclaredMethod("getConfigurationSource", URL.class); + method.setAccessible(true); + final Object result = method.invoke(null, url); + + assertTrue(openConnectionCalls.get() > 0, "Custom URLStreamHandler was not used by UrlConnectionFactory"); + + assertNull(result, "Expected null return for a 404 response"); + + assertTrue(disconnected.get(), "disconnect() must be called on the error path"); + + assertEquals(1, getInputStreamCalls.get(), "getInputStream() should be called exactly once"); + } finally { + if (previous != null) { + System.setProperty(propKey, previous); + } else { + System.clearProperty(propKey); + } + } + } + private long getOpenFileDescriptorCount() { final OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); if (os instanceof UnixOperatingSystemMXBean) { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java index dd50987f257..d2fdf0adf1a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java @@ -23,6 +23,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.HttpURLConnection; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URI; @@ -356,30 +357,40 @@ public String toString() { value = "PATH_TRAVERSAL_IN", justification = "The name of the accessed files is based on a configuration value.") private static /*@Nullable*/ ConfigurationSource getConfigurationSource(final URL url) { + final File file; + final URLConnection urlConnection; try { - final File file = FileUtils.fileFromUri(url.toURI()); - final URLConnection urlConnection = UrlConnectionFactory.createConnection(url); - try { - if (file != null) { - return new ConfigurationSource(urlConnection.getInputStream(), FileUtils.fileFromUri(url.toURI())); - } else if (urlConnection instanceof JarURLConnection) { - // Work around https://bugs.openjdk.java.net/browse/JDK-6956385. - URL jarFileUrl = ((JarURLConnection) urlConnection).getJarFileURL(); - File jarFile = new File(jarFileUrl.getFile()); - long lastModified = jarFile.lastModified(); - return new ConfigurationSource(urlConnection.getInputStream(), url, lastModified); - } else { - return new ConfigurationSource( - urlConnection.getInputStream(), url, urlConnection.getLastModified()); - } - } catch (FileNotFoundException ex) { - ConfigurationFactory.LOGGER.info("Unable to locate file {}, ignoring.", url.toString()); - return null; - } - } catch (IOException | URISyntaxException ex) { + file = FileUtils.fileFromUri(url.toURI()); + urlConnection = UrlConnectionFactory.createConnection(url); + } catch (final IOException | URISyntaxException ex) { ConfigurationFactory.LOGGER.warn( "Error accessing {} due to {}, ignoring.", url.toString(), ex.getMessage()); return null; } + try { + if (file != null) { + return new ConfigurationSource(urlConnection.getInputStream(), file); + } else if (urlConnection instanceof JarURLConnection) { + // Work around https://bugs.openjdk.java.net/browse/JDK-6956385. + final URL jarFileUrl = ((JarURLConnection) urlConnection).getJarFileURL(); + final File jarFile = new File(jarFileUrl.getFile()); + final long lastModified = jarFile.lastModified(); + return new ConfigurationSource(urlConnection.getInputStream(), url, lastModified); + } else { + final long lastModified = urlConnection.getLastModified(); + return new ConfigurationSource(urlConnection.getInputStream(), url, lastModified); + } + } catch (final IOException ex) { + if (ex instanceof FileNotFoundException) { + ConfigurationFactory.LOGGER.info("Unable to locate file {}, ignoring.", url.toString()); + } else { + ConfigurationFactory.LOGGER.warn( + "Error accessing {} due to {}, ignoring.", url.toString(), ex.getMessage()); + } + if (urlConnection instanceof HttpURLConnection) { + ((HttpURLConnection) urlConnection).disconnect(); + } + return null; + } } } diff --git a/src/changelog/.2.x.x/fix_configuration_source_url_leak.xml b/src/changelog/.2.x.x/fix_configuration_source_url_leak.xml new file mode 100644 index 00000000000..e7c57d5a1a1 --- /dev/null +++ b/src/changelog/.2.x.x/fix_configuration_source_url_leak.xml @@ -0,0 +1,8 @@ + + + + Fix resource leaks in `ConfigurationSource` when loading configuration via URL fails + From bd750d58b7f9879bee9eadcdef330e0cbc28b934 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Fri, 12 Jun 2026 00:10:40 +0530 Subject: [PATCH 08/23] Fix `DatePatternConverter` locale parsing when timezone is omitted (#4130) --- ...DatePatternConverter_locale_without_timezone.xml | 13 +++++++++++++ .../modules/ROOT/pages/manual/pattern-layout.adoc | 12 ++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/changelog/.2.x.x/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml diff --git a/src/changelog/.2.x.x/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml b/src/changelog/.2.x.x/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml new file mode 100644 index 00000000000..52238f30fb0 --- /dev/null +++ b/src/changelog/.2.x.x/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml @@ -0,0 +1,13 @@ + + + + + + Improved documentation for locale handling in the Pattern Layout date pattern converter. + + diff --git a/src/site/antora/modules/ROOT/pages/manual/pattern-layout.adoc b/src/site/antora/modules/ROOT/pages/manual/pattern-layout.adoc index 0199783f1d0..ebe36a6f529 100644 --- a/src/site/antora/modules/ROOT/pages/manual/pattern-layout.adoc +++ b/src/site/antora/modules/ROOT/pages/manual/pattern-layout.adoc @@ -389,8 +389,12 @@ Outputs the instant of the log event .link:../javadoc/log4j-core/org/apache/logging/log4j/core/pattern/DatePatternConverter.html[`DatePatternConverter`] specifier grammar [source,text] ---- -d{pattern}[{timezone}] -date{pattern}[{timezone}] +d{pattern} +d{pattern}{timezone} +d{pattern}{timezone}{locale} +date{pattern} +date{pattern}{timezone} +date{pattern}{timezone}{locale} ---- The date conversion specifier may be followed by a set of braces containing a date and time formatting pattern per https://docs.oracle.com/javase/{java-target-version}/docs/api/java/time/format/DateTimeFormatter.html[`DateTimeFormatter`]. @@ -462,6 +466,10 @@ You can also define custom date formats, see following examples: |%d{yyyy-mm-dd'T'HH:mm:ss.SSS'Z'}\{UTC} |2012-11-02T14:34:02.123Z + + +|%d{dd-MMMM-yyyy}\{UTC}\{de-DE} +|02 November 2012 (UTC timezone, German locale) |=== `%d\{UNIX}` outputs the epoch time in seconds, i.e., the difference in seconds between the current time and 1970-01-01 00:00:00 (UTC). From c123c465beb647f2ab2fe2c0ffd36f652e92ec91 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Fri, 29 May 2026 16:54:39 +0530 Subject: [PATCH 09/23] Improve logging for `LinkageError` scenarios involving the LMAX Disruptor library (#4124) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Volkan Yazıcı --- .../log4j/core/async/DisruptorUtilTest.java | 63 +++++++++++++++++++ .../log4j/core/async/DisruptorUtil.java | 10 ++- ...ix-log-disruptor-initialization-errors.xml | 13 ++++ 3 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorUtilTest.java create mode 100644 src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorUtilTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorUtilTest.java new file mode 100644 index 00000000000..4bd10487157 --- /dev/null +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorUtilTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.logging.log4j.core.async; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.status.StatusData; +import org.apache.logging.log4j.test.ListStatusListener; +import org.apache.logging.log4j.test.junit.UsingStatusListener; +import org.junit.jupiter.api.Test; + +@UsingStatusListener +class DisruptorUtilTest { + + @Test + void detectDisruptorMajorVersion_returnsValidVersion() throws Exception { + final Method method = DisruptorUtil.class.getDeclaredMethod("detectDisruptorMajorVersion"); + method.setAccessible(true); + final int detectedVersion = (int) method.invoke(null); + + assertThat(detectedVersion).isIn(3, 4); + } + + @Test + void detectDisruptorMajorVersion_logsVersionDetection(final ListStatusListener statusListener) throws Exception { + final Method method = DisruptorUtil.class.getDeclaredMethod("detectDisruptorMajorVersion"); + method.setAccessible(true); + final int detectedVersion = (int) method.invoke(null); + + final List debugData = + statusListener.findStatusData(Level.DEBUG).collect(Collectors.toList()); + + if (detectedVersion == 4) { + // v4 path: ClassNotFoundException caught, falls through to LOGGER.debug() + assertThat(debugData) + .anySatisfy(data -> assertThat(data.getMessage().getFormattedMessage()) + .contains("LMAX Disruptor version detected: 4")); + } else { + // v3 path: early `return 3` inside try — LOGGER.debug() is never reached + assertThat(debugData) + .noneSatisfy(data -> assertThat(data.getMessage().getFormattedMessage()) + .contains("LMAX Disruptor version detected:")); + } + } +} diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java index f115e2ae378..11479928f61 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java @@ -55,13 +55,17 @@ final class DisruptorUtil { // TODO: replace with LoaderUtil.isClassAvailable() when TCCL is removed // See: https://github.com/apache/logging-log4j2/issues/3706 private static int detectDisruptorMajorVersion() { + int version = 4; try { Class.forName( - "com.lmax.disruptor.SequenceReportingEventHandler", true, DisruptorUtil.class.getClassLoader()); + "com.lmax.disruptor.SequenceReportingEventHandler", false, DisruptorUtil.class.getClassLoader()); + version = 3; return 3; - } catch (final ClassNotFoundException e) { - return 4; + } catch (final ClassNotFoundException ignored) { + // Do nothing } + LOGGER.debug("LMAX Disruptor version detected: {}", version); + return version; } private DisruptorUtil() {} diff --git a/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml b/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml new file mode 100644 index 00000000000..c47b11fb809 --- /dev/null +++ b/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml @@ -0,0 +1,13 @@ + + + + + + Improve logging for `LinkageError` scenarios involving the LMAX Disruptor library + + From 833366fbd09dc96534627219d5ddc1a8b9b8119d Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Mon, 1 Jun 2026 19:44:58 +0530 Subject: [PATCH 10/23] Fix changelog issue and PR references for Disruptor initialization error logging (#2250, #4124, #4134) --- .../.2.x.x/fix-log-disruptor-initialization-errors.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml b/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml index c47b11fb809..defea45980e 100644 --- a/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml +++ b/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml @@ -5,8 +5,8 @@ https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="changed"> - - + + Improve logging for `LinkageError` scenarios involving the LMAX Disruptor library From d3f25ac2ee786d5bd7d9359d5ec5d216d36f4699 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Fri, 22 May 2026 01:03:29 +0530 Subject: [PATCH 11/23] Fix `createOnDemand` for Rolling File Appender (#4072) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Piotr P. Karwasz Co-authored-by: Volkan Yazıcı --- .../RollingFileManagerCreateOnDemandTest.java | 72 +++++++++++++++++++ .../appender/rolling/RollingFileManager.java | 27 +++---- ...Fix_RollingFileAppender_createOnDemand.xml | 14 ++++ 3 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerCreateOnDemandTest.java create mode 100644 src/changelog/.2.x.x/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerCreateOnDemandTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerCreateOnDemandTest.java new file mode 100644 index 00000000000..6a2e16f457a --- /dev/null +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerCreateOnDemandTest.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.logging.log4j.core.appender.rolling; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.logging.log4j.core.config.NullConfiguration; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class RollingFileManagerCreateOnDemandTest { + @Test + void testCreateOnDemandDoesNotCreateDirectoryOrFile(@TempDir Path tempDir) throws Exception { + Path logDir = tempDir.resolve("onDemand"); + String logFile = logDir.resolve("test.log").toString(); + File dir = logDir.toFile(); + File file = new File(logFile); + assertFalse(dir.exists(), "Directory should not exist before logging"); + assertFalse(file.exists(), "File should not exist before logging"); + + RollingFileManager manager = RollingFileManager.getFileManager( + logFile, + logFile + ".%d{yyyy-MM-dd}", + true, + false, + NoOpTriggeringPolicy.INSTANCE, + DefaultRolloverStrategy.newBuilder().build(), + null, + PatternLayout.createDefaultLayout(), + 0, + true, + true, + null, + null, + null, + new NullConfiguration()); + assertNotNull(manager); + // Directory and file should still not exist + assertFalse(dir.exists(), "Directory should not exist after manager creation"); + assertFalse(file.exists(), "File should not exist after manager creation"); + + // Log a message + manager.writeToDestination("Hello Log4j2".getBytes(), 0, "Hello Log4j2".length()); + manager.close(); + + // Now directory and file should exist + assertTrue(dir.exists(), "Directory should exist after first log event"); + assertTrue(file.exists(), "File should exist after first log event"); + String content = new String(Files.readAllBytes(file.toPath())); + assertTrue(content.contains("Hello Log4j2")); + } +} diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java index afdb7416585..0c62bfac965 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java @@ -310,14 +310,17 @@ public static RollingFileManager getFileManager( if (fileName != null) { file = new File(fileName); - try { - FileUtils.makeParentDirs(file); - final boolean created = createOnDemand ? false : file.createNewFile(); - LOGGER.trace("New file '{}' created = {}", name, created); - } catch (final IOException ioe) { - LOGGER.error("Unable to create file {}", name, ioe); - return null; + if (!createOnDemand) { + try { + FileUtils.makeParentDirs(file); + final boolean created = file.createNewFile(); + LOGGER.trace("New file '{}' created = {}", name, created); + } catch (final IOException ioe) { + LOGGER.error("Unable to create file {}", name, ioe); + return null; + } } + size = append ? file.length() : 0; } @@ -391,12 +394,10 @@ public String getFileName() { @Override protected void createParentDir(File file) { - if (directWrite) { - final File parent = file.getParentFile(); - // If the parent is null the file is in the current working directory. - if (parent != null) { - parent.mkdirs(); - } + try { + FileUtils.makeParentDirs(file); + } catch (IOException e) { + LOGGER.error("Unable to create parent directories for file {}", file, e); } } diff --git a/src/changelog/.2.x.x/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml b/src/changelog/.2.x.x/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml new file mode 100644 index 00000000000..33d6f9e9fe0 --- /dev/null +++ b/src/changelog/.2.x.x/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml @@ -0,0 +1,14 @@ + + + + + + Fix the `createOnDemand` behavior of `RollingFileAppender` to correctly defer file and directory creation + until the first log event, while preserving eager creation when disabled. + + \ No newline at end of file From 8a79525cf338f9aeba0cf355ddd098e9a8a09b89 Mon Sep 17 00:00:00 2001 From: Sebastien Tardif Date: Tue, 19 May 2026 22:55:55 -0700 Subject: [PATCH 12/23] Fix KafkaAppender reporting error after successful retry (#4125) * Fix KafkaAppender reporting error after successful retry When retryCount is configured and the initial tryAppend() fails, the retry loop uses break to exit on success. However, break only exits the while loop and execution always reaches the error() call afterward. This causes spurious error notifications for transient Kafka failures that were successfully recovered by a retry. Replace break with return so that a successful retry exits append() without reporting an error. Retry exceptions are now logged at DEBUG level for diagnostics instead of being silently discarded. Also remove dead code in Builder.getRetryCount() where Integer.valueOf(int) was wrapped in a NumberFormatException catch that can never fire. The bug was introduced in #315. Signed-off-by: Sebastien Tardif * Add changelog entry for KafkaAppender retry fix Signed-off-by: Sebastien Tardif * Use CloseableThreadContext in testRetrySuccessDoesNotReportError Adopt reviewer suggestion to use try-with-resources CloseableThreadContext instead of manual ThreadContext.put/clearMap. --------- Signed-off-by: Sebastien Tardif --- .../appender/mom/kafka/KafkaAppenderTest.java | 53 ++++++++++++++++--- .../appender/mom/kafka/KafkaAppender.java | 20 ++++--- ...x_kafka_appender_retry_error_reporting.xml | 8 +++ 3 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 src/changelog/.2.x.x/fix_kafka_appender_retry_error_reporting.xml diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java index ef8c24edf00..b265126cd20 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -30,14 +31,18 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.serialization.ByteArraySerializer; import org.apache.kafka.common.serialization.Serializer; +import org.apache.logging.log4j.CloseableThreadContext; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.ErrorHandler; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.impl.Log4jLogEvent; import org.apache.logging.log4j.core.test.categories.Appenders; @@ -55,6 +60,8 @@ public class KafkaAppenderTest { private static final Serializer SERIALIZER = new ByteArraySerializer(); + private static final AtomicInteger retrySendCount = new AtomicInteger(0); + private static final MockProducer kafka = new MockProducer(true, SERIALIZER, SERIALIZER) { @@ -65,12 +72,13 @@ public synchronized Future send(final ProducerRecord> history = kafka.history(); + assertEquals(2, history.size()); + assertFalse("Error should not be reported when retry succeeds", errorReported.get()); + } finally { + ((KafkaAppender) appender).setHandler(originalHandler); + } + } + @Test public void testAppenderNoEventTimestamp() { final Appender appender = ctx.getRequiredAppender("KafkaAppenderNoEventTimestamp"); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java index a9788a2a59b..2fbccff7b04 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java @@ -94,13 +94,7 @@ public KafkaAppender build() { } public Integer getRetryCount() { - Integer intRetryCount = null; - try { - intRetryCount = Integer.valueOf(retryCount); - } catch (NumberFormatException e) { - - } - return intRetryCount; + return retryCount; } public String getTopic() { @@ -216,16 +210,20 @@ public void append(final LogEvent event) { try { tryAppend(event); } catch (final Exception e) { - if (this.retryCount != null) { int currentRetryAttempt = 0; while (currentRetryAttempt < this.retryCount) { currentRetryAttempt++; try { tryAppend(event); - break; - } catch (Exception e1) { - + return; + } catch (final Exception retryException) { + LOGGER.debug( + "Unable to write to Kafka in appender [{}], retry attempt [{}/{}].", + getName(), + currentRetryAttempt, + this.retryCount, + retryException); } } } diff --git a/src/changelog/.2.x.x/fix_kafka_appender_retry_error_reporting.xml b/src/changelog/.2.x.x/fix_kafka_appender_retry_error_reporting.xml new file mode 100644 index 00000000000..f3884f41e8b --- /dev/null +++ b/src/changelog/.2.x.x/fix_kafka_appender_retry_error_reporting.xml @@ -0,0 +1,8 @@ + + + + Fix `KafkaAppender` reporting error to error handler even after a successful retry + From 3944353b0d5dd7e36be746c04d2327185441f220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Fri, 5 Jun 2026 10:13:02 +0200 Subject: [PATCH 13/23] Fix encoding of `MSGID` and `SD-ID` fields of `StructuredDataMessage` to XML (#4136) --- .../message/StructuredDataMessageTest.java | 58 +++++++++++++++++++ .../log4j/message/StructuredDataMessage.java | 20 ++++++- ...fix-StructuredDataMessage-XML-encoding.xml | 12 ++++ 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/changelog/.2.x.x/fix-StructuredDataMessage-XML-encoding.xml diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StructuredDataMessageTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StructuredDataMessageTest.java index f02d95eefef..3d3f403bef7 100644 --- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StructuredDataMessageTest.java +++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StructuredDataMessageTest.java @@ -73,6 +73,64 @@ void testMsgXml() { assertEquals(expected, result); } + @Test + void testXmlEncodingOfIdAndType1() { + final String id = "i<&d>" + XmlFixture.TEXT; + final String type = "t>ypt>yp<e&" + XmlFixture.ENCODED_TEXT + + "\n" + + "i<&d>" + XmlFixture.ENCODED_TEXT + + "\n" + // Following part is encoded by `MapMessage::asXml`, hence, fuzzed & tested elsewhere + + "\n" + + "\n" + + "\n"; + assertEquals(expectedXml, actualXml); + } + + @Test + void testXmlEncodingOfIdAndType2() { + final String idName = "id&<-name>" + XmlFixture.TEXT; + final String idEnterpriseNumber = "id&<-enterprise-number>" + XmlFixture.TEXT; + final String[] idRequired = {"id&<-required>" + XmlFixture.TEXT}; + final String[] idOptional = {"id&<-optional>" + XmlFixture.TEXT}; + final String type = "t>ypt>yp<e&" + XmlFixture.ENCODED_TEXT + + "\n" + + "" + "id&<-name>" + XmlFixture.ENCODED_TEXT + + "@id&<-enterprise-number>" + XmlFixture.ENCODED_TEXT + + "\n" + // Following part is encoded by `MapMessage::asXml`, hence, fuzzed & tested elsewhere + + "\n" + + "\n" + + "\n"; + assertEquals(expectedXml, actualXml); + } + + private enum XmlFixture { + ; + + private static final String TEXT; + + private static final String ENCODED_TEXT; + + static { + final String notBmp = new String(Character.toChars(0x10000)); + final String invalid = "A\uD800B\uDE00C\0\1\2\3"; + final String encodedInvalid = "A\uFFFDB\uFFFDC\uFFFD\uFFFD\uFFFD\uFFFD"; + TEXT = " '\"\t\r\n" + notBmp + invalid; + ENCODED_TEXT = " '"\t\r\n" + notBmp + encodedInvalid; + } + } + @Test void testBuilder() { final String testMsg = "Test message {}"; diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java index 46b757d54f2..69fa3fb8cbe 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java @@ -356,10 +356,26 @@ public final void asString(final Format format, final StructuredDataId structure } private void asXml(final StructuredDataId structuredDataId, final StringBuilder sb) { + sb.append("\n"); - sb.append("").append(type).append("\n"); - sb.append("").append(structuredDataId).append("\n"); + + // Encode type + sb.append(""); + int start = sb.length(); + sb.append(type); + StringBuilders.escapeXml(sb, start); + sb.append("\n"); + + // Encode ID + sb.append(""); + start = sb.length(); + structuredDataId.formatTo(sb); + StringBuilders.escapeXml(sb, start); + sb.append("\n"); + + // Encode the rest super.asXml(sb); + sb.append("\n\n"); } diff --git a/src/changelog/.2.x.x/fix-StructuredDataMessage-XML-encoding.xml b/src/changelog/.2.x.x/fix-StructuredDataMessage-XML-encoding.xml new file mode 100644 index 00000000000..ae324c0d21d --- /dev/null +++ b/src/changelog/.2.x.x/fix-StructuredDataMessage-XML-encoding.xml @@ -0,0 +1,12 @@ + + + + + Fix encoding of `MSGID` and `SD-ID` fields of `StructuredDataMessage` to XML + + From 69d6641e41f97f934858bf30a52eb4be80dcb5c5 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Fri, 26 Jun 2026 04:50:46 +0530 Subject: [PATCH 14/23] add patch release/2.26.1 liked commits and moved changelog the release/2.26.1 folder --- pom.xml | 8 ++--- src/changelog/2.26.1/.release-notes.adoc.ftl | 33 +++++++++++++++++++ src/changelog/2.26.1/.release.xml | 21 ++++++++++++ ...Fix_RollingFileAppender_createOnDemand.xml | 0 ...tternConverter_locale_without_timezone.xml | 0 ...fix-StructuredDataMessage-XML-encoding.xml | 0 ...etection-for-exceptions-with-colliding.xml | 0 ...ix-log-disruptor-initialization-errors.xml | 0 .../fix_configuration_source_url_leak.xml | 0 ...x_kafka_appender_retry_error_reporting.xml | 0 10 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/changelog/2.26.1/.release-notes.adoc.ftl create mode 100644 src/changelog/2.26.1/.release.xml rename src/changelog/{.2.x.x => 2.26.1}/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml (100%) rename src/changelog/{.2.x.x => 2.26.1}/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml (100%) rename src/changelog/{.2.x.x => 2.26.1}/fix-StructuredDataMessage-XML-encoding.xml (100%) rename src/changelog/{.2.x.x => 2.26.1}/fix-circular-reference-detection-for-exceptions-with-colliding.xml (100%) rename src/changelog/{.2.x.x => 2.26.1}/fix-log-disruptor-initialization-errors.xml (100%) rename src/changelog/{.2.x.x => 2.26.1}/fix_configuration_source_url_leak.xml (100%) rename src/changelog/{.2.x.x => 2.26.1}/fix_kafka_appender_retry_error_reporting.xml (100%) diff --git a/pom.xml b/pom.xml index 69f4b16d794..4ef2681a59e 100644 --- a/pom.xml +++ b/pom.xml @@ -307,11 +307,11 @@ - 2.26.0 + 2.26.1-SNAPSHOT - 2.25.4 - 2.25.4 - 2.25.4 + 2.26.0 + 2.26.0 + 2.26.0 + diff --git a/src/changelog/.2.x.x/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml b/src/changelog/2.26.1/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml similarity index 100% rename from src/changelog/.2.x.x/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml rename to src/changelog/2.26.1/LOG4J2-2006_Fix_RollingFileAppender_createOnDemand.xml diff --git a/src/changelog/.2.x.x/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml b/src/changelog/2.26.1/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml similarity index 100% rename from src/changelog/.2.x.x/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml rename to src/changelog/2.26.1/LOG4J2-4129_Fix_DatePatternConverter_locale_without_timezone.xml diff --git a/src/changelog/.2.x.x/fix-StructuredDataMessage-XML-encoding.xml b/src/changelog/2.26.1/fix-StructuredDataMessage-XML-encoding.xml similarity index 100% rename from src/changelog/.2.x.x/fix-StructuredDataMessage-XML-encoding.xml rename to src/changelog/2.26.1/fix-StructuredDataMessage-XML-encoding.xml diff --git a/src/changelog/.2.x.x/fix-circular-reference-detection-for-exceptions-with-colliding.xml b/src/changelog/2.26.1/fix-circular-reference-detection-for-exceptions-with-colliding.xml similarity index 100% rename from src/changelog/.2.x.x/fix-circular-reference-detection-for-exceptions-with-colliding.xml rename to src/changelog/2.26.1/fix-circular-reference-detection-for-exceptions-with-colliding.xml diff --git a/src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml b/src/changelog/2.26.1/fix-log-disruptor-initialization-errors.xml similarity index 100% rename from src/changelog/.2.x.x/fix-log-disruptor-initialization-errors.xml rename to src/changelog/2.26.1/fix-log-disruptor-initialization-errors.xml diff --git a/src/changelog/.2.x.x/fix_configuration_source_url_leak.xml b/src/changelog/2.26.1/fix_configuration_source_url_leak.xml similarity index 100% rename from src/changelog/.2.x.x/fix_configuration_source_url_leak.xml rename to src/changelog/2.26.1/fix_configuration_source_url_leak.xml diff --git a/src/changelog/.2.x.x/fix_kafka_appender_retry_error_reporting.xml b/src/changelog/2.26.1/fix_kafka_appender_retry_error_reporting.xml similarity index 100% rename from src/changelog/.2.x.x/fix_kafka_appender_retry_error_reporting.xml rename to src/changelog/2.26.1/fix_kafka_appender_retry_error_reporting.xml From 6c2d9318d65ddd319fc6bcd80f0619ea5f4d53f0 Mon Sep 17 00:00:00 2001 From: ASF Logging Services RM Date: Thu, 25 Jun 2026 23:51:07 +0000 Subject: [PATCH 15/23] Set version to `2.26.1` --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4ef2681a59e..a9c59d31d25 100644 --- a/pom.xml +++ b/pom.xml @@ -307,7 +307,7 @@ - 2.26.1-SNAPSHOT + 2.26.1 2.26.0 2.26.0 From 5755541edfb32e5791214955f1472c8492389c95 Mon Sep 17 00:00:00 2001 From: ASF Logging Services RM Date: Thu, 25 Jun 2026 23:51:09 +0000 Subject: [PATCH 16/23] Update the `project.build.outputTimestamp` property --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a9c59d31d25..eba2fe517e6 100644 --- a/pom.xml +++ b/pom.xml @@ -325,7 +325,7 @@ 2. This value is employed in various places while creating the distribution To mitigate these, we define a *dummy* value here and let the CI replace it during a release. Hence, *DO NOT MANUALLY EDIT THIS VALUE*! --> - 2026-03-25T07:52:12Z + 2026-06-25T23:51:07Z 2.26.1 - 2.26.0 - 2.26.0 - 2.26.0 + 2.26.1 + 2.26.1 + 2.26.1 - 2026-06-25T23:51:07Z + 2026-06-29T07:01:45Z