Register Logback's pattern conversion rule using Suppliers

This commit makes use of a feature introduced in LogBack 1.5.15 that
allows converter to be specified using a supplier rather than a fully
qualified class name.

Closes gh-43588
This commit is contained in:
Stéphane Nicoll 2025-01-08 08:59:51 +01:00
parent a2d038f2f5
commit b84618fab9
4 changed files with 25 additions and 20 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2025 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,8 @@
package org.springframework.boot.logging.logback; package org.springframework.boot.logging.logback;
import java.util.function.Supplier;
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ILoggingEvent;
@ -38,10 +40,10 @@ class DebugLogbackConfigurator extends LogbackConfigurator {
} }
@Override @Override
@SuppressWarnings("rawtypes") <T extends Converter<?>> void conversionRule(String conversionWord, Class<T> converterClass,
public void conversionRule(String conversionWord, Class<? extends Converter> converterClass) { Supplier<T> converterSupplier) {
info("Adding conversion rule of type '" + converterClass.getName() + "' for word '" + conversionWord + "'"); info("Adding conversion rule of type '" + converterClass.getName() + "' for word '" + conversionWord + "'");
super.conversionRule(conversionWord, converterClass); super.conversionRule(conversionWord, converterClass, converterSupplier);
} }
@Override @Override

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2024 the original author or authors. * Copyright 2012-2025 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -99,11 +99,12 @@ class DefaultLogbackConfiguration {
private void defaults(LogbackConfigurator config) { private void defaults(LogbackConfigurator config) {
deprecatedDefaults(config); deprecatedDefaults(config);
config.conversionRule("clr", ColorConverter.class); config.conversionRule("clr", ColorConverter.class, ColorConverter::new);
config.conversionRule("correlationId", CorrelationIdConverter.class); config.conversionRule("correlationId", CorrelationIdConverter.class, CorrelationIdConverter::new);
config.conversionRule("esb", EnclosedInSquareBracketsConverter.class); config.conversionRule("esb", EnclosedInSquareBracketsConverter.class, EnclosedInSquareBracketsConverter::new);
config.conversionRule("wex", WhitespaceThrowableProxyConverter.class); config.conversionRule("wex", WhitespaceThrowableProxyConverter.class, WhitespaceThrowableProxyConverter::new);
config.conversionRule("wEx", ExtendedWhitespaceThrowableProxyConverter.class); config.conversionRule("wEx", ExtendedWhitespaceThrowableProxyConverter.class,
ExtendedWhitespaceThrowableProxyConverter::new);
putProperty(config, "CONSOLE_LOG_PATTERN", CONSOLE_LOG_PATTERN); putProperty(config, "CONSOLE_LOG_PATTERN", CONSOLE_LOG_PATTERN);
putProperty(config, "CONSOLE_LOG_CHARSET", "${CONSOLE_LOG_CHARSET:-" + DEFAULT_CHARSET + "}"); putProperty(config, "CONSOLE_LOG_CHARSET", "${CONSOLE_LOG_CHARSET:-" + DEFAULT_CHARSET + "}");
putProperty(config, "CONSOLE_LOG_THRESHOLD", "${CONSOLE_LOG_THRESHOLD:-TRACE}"); putProperty(config, "CONSOLE_LOG_THRESHOLD", "${CONSOLE_LOG_THRESHOLD:-TRACE}");
@ -124,7 +125,7 @@ class DefaultLogbackConfiguration {
@SuppressWarnings("removal") @SuppressWarnings("removal")
private void deprecatedDefaults(LogbackConfigurator config) { private void deprecatedDefaults(LogbackConfigurator config) {
config.conversionRule("applicationName", ApplicationNameConverter.class); config.conversionRule("applicationName", ApplicationNameConverter.class, ApplicationNameConverter::new);
} }
void putProperty(LogbackConfigurator config, String name, String val) { void putProperty(LogbackConfigurator config, String name, String val) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2024 the original author or authors. * Copyright 2012-2025 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -19,6 +19,7 @@ package org.springframework.boot.logging.logback;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Supplier;
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.Logger;
@ -54,17 +55,18 @@ class LogbackConfigurator {
return this.context.getConfigurationLock(); return this.context.getConfigurationLock();
} }
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings("unchecked")
void conversionRule(String conversionWord, Class<? extends Converter> converterClass) { <T extends Converter<?>> void conversionRule(String conversionWord, Class<T> converterClass,
Supplier<T> converterSupplier) {
Assert.hasLength(conversionWord, "Conversion word must not be empty"); Assert.hasLength(conversionWord, "Conversion word must not be empty");
Assert.notNull(converterClass, "Converter class must not be null"); Assert.notNull(converterSupplier, "Converter supplier must not be null");
Map<String, String> registry = (Map<String, String>) this.context Map<String, Supplier<?>> registry = (Map<String, Supplier<?>>) this.context
.getObject(CoreConstants.PATTERN_RULE_REGISTRY); .getObject(CoreConstants.PATTERN_RULE_REGISTRY_FOR_SUPPLIERS);
if (registry == null) { if (registry == null) {
registry = new HashMap<>(); registry = new HashMap<>();
this.context.putObject(CoreConstants.PATTERN_RULE_REGISTRY, registry); this.context.putObject(CoreConstants.PATTERN_RULE_REGISTRY_FOR_SUPPLIERS, registry);
} }
registry.put(conversionWord, converterClass.getName()); registry.put(conversionWord, converterSupplier);
} }
void appender(String name, Appender<?> appender) { void appender(String name, Appender<?> appender) {

View File

@ -8,7 +8,7 @@ Default logback configuration provided for import
<conversionRule conversionWord="applicationName" class="org.springframework.boot.logging.logback.ApplicationNameConverter"/> <conversionRule conversionWord="applicationName" class="org.springframework.boot.logging.logback.ApplicationNameConverter"/>
<conversionRule conversionWord="clr" class="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="clr" class="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="correlationId" class="org.springframework.boot.logging.logback.CorrelationIdConverter"/> <conversionRule conversionWord="correlationId" class="org.springframework.boot.logging.logback.CorrelationIdConverter"/>
<conversionRule conversionWord="esb" class="org.springframework.boot.logging.logback.EnclosedInSquareBracketsConverter" /> <conversionRule conversionWord="esb" class="org.springframework.boot.logging.logback.EnclosedInSquareBracketsConverter" />
<conversionRule conversionWord="wex" class="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wex" class="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" class="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wEx" class="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />