From b7a737e8e0de6bae7d7b45de2e4cbe2014a59b2e Mon Sep 17 00:00:00 2001 From: Michel Palourdio Date: Tue, 10 Dec 2024 18:15:01 +0100 Subject: [PATCH] feat: Add ability to customize access log prefix for management logs --- .../server/ManagementServerProperties.java | 24 ++++++++++++ ...etManagementChildContextConfiguration.java | 39 ++++++++++++++----- .../ManagementServerPropertiesTests.java | 6 +++ 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerProperties.java index e476398f5415..1e7495e61c20 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerProperties.java @@ -57,6 +57,8 @@ public class ManagementServerProperties { @NestedConfigurationProperty private Ssl ssl; + private final Accesslog accesslog = new Accesslog(); + /** * Returns the management port or {@code null} if the * {@link ServerProperties#getPort() server port} should be used. @@ -117,4 +119,26 @@ private String cleanBasePath(String basePath) { return candidate; } + public Accesslog getAccesslog() { + return this.accesslog; + } + + public static class Accesslog { + + /** + * Enable management access logs prefix customization + * management.server.accesslog.prefix. + */ + private String prefix = "management_"; + + public String getPrefix() { + return this.prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/ServletManagementChildContextConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/ServletManagementChildContextConfiguration.java index 71beda39b6ba..e382f0476c05 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/ServletManagementChildContextConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/ServletManagementChildContextConfiguration.java @@ -47,6 +47,7 @@ import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryCustomizer; import org.springframework.boot.autoconfigure.web.servlet.TomcatServletWebServerFactoryCustomizer; import org.springframework.boot.autoconfigure.web.servlet.UndertowServletWebServerFactoryCustomizer; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; @@ -73,6 +74,7 @@ */ @ManagementContextConfiguration(value = ManagementContextType.CHILD, proxyBeanMethods = false) @ConditionalOnWebApplication(type = Type.SERVLET) +@EnableConfigurationProperties(ManagementServerProperties.class) class ServletManagementChildContextConfiguration { @Bean @@ -83,20 +85,22 @@ ServletManagementWebServerFactoryCustomizer servletManagementWebServerFactoryCus @Bean @ConditionalOnClass(name = "io.undertow.Undertow") - UndertowAccessLogCustomizer undertowManagementAccessLogCustomizer() { - return new UndertowAccessLogCustomizer(); + UndertowAccessLogCustomizer undertowManagementAccessLogCustomizer( + ManagementServerProperties managementServerProperties) { + return new UndertowAccessLogCustomizer(managementServerProperties); } @Bean @ConditionalOnClass(name = "org.apache.catalina.valves.AccessLogValve") - TomcatAccessLogCustomizer tomcatManagementAccessLogCustomizer() { - return new TomcatAccessLogCustomizer(); + TomcatAccessLogCustomizer tomcatManagementAccessLogCustomizer( + ManagementServerProperties managementServerProperties) { + return new TomcatAccessLogCustomizer(managementServerProperties); } @Bean @ConditionalOnClass(name = "org.eclipse.jetty.server.Server") - JettyAccessLogCustomizer jettyManagementAccessLogCustomizer() { - return new JettyAccessLogCustomizer(); + JettyAccessLogCustomizer jettyManagementAccessLogCustomizer(ManagementServerProperties managementServerProperties) { + return new JettyAccessLogCustomizer(managementServerProperties); } @Configuration(proxyBeanMethods = false) @@ -145,14 +149,18 @@ private String getContextPath(ManagementServerProperties managementServerPropert abstract static class AccessLogCustomizer implements Ordered { - private static final String MANAGEMENT_PREFIX = "management_"; + protected final ManagementServerProperties managementServerProperties; + + AccessLogCustomizer(ManagementServerProperties managementServerProperties) { + this.managementServerProperties = managementServerProperties; + } protected String customizePrefix(String prefix) { prefix = (prefix != null) ? prefix : ""; - if (prefix.startsWith(MANAGEMENT_PREFIX)) { + if (prefix.startsWith(this.managementServerProperties.getAccesslog().getPrefix())) { return prefix; } - return MANAGEMENT_PREFIX + prefix; + return this.managementServerProperties.getAccesslog().getPrefix() + prefix; } @Override @@ -165,12 +173,17 @@ public int getOrder() { static class TomcatAccessLogCustomizer extends AccessLogCustomizer implements WebServerFactoryCustomizer { + TomcatAccessLogCustomizer(ManagementServerProperties managementServerProperties) { + super(managementServerProperties); + } + @Override public void customize(TomcatServletWebServerFactory factory) { AccessLogValve accessLogValve = findAccessLogValve(factory); if (accessLogValve == null) { return; } + accessLogValve.setPrefix(customizePrefix(accessLogValve.getPrefix())); } @@ -188,6 +201,10 @@ private AccessLogValve findAccessLogValve(TomcatServletWebServerFactory factory) static class UndertowAccessLogCustomizer extends AccessLogCustomizer implements WebServerFactoryCustomizer { + UndertowAccessLogCustomizer(ManagementServerProperties managementServerProperties) { + super(managementServerProperties); + } + @Override public void customize(UndertowServletWebServerFactory factory) { factory.setAccessLogPrefix(customizePrefix(factory.getAccessLogPrefix())); @@ -198,6 +215,10 @@ public void customize(UndertowServletWebServerFactory factory) { static class JettyAccessLogCustomizer extends AccessLogCustomizer implements WebServerFactoryCustomizer { + JettyAccessLogCustomizer(ManagementServerProperties managementServerProperties) { + super(managementServerProperties); + } + @Override public void customize(JettyServletWebServerFactory factory) { factory.addServerCustomizers(this::customizeServer); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerPropertiesTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerPropertiesTests.java index 8ab33edfe81b..9d28255f461d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerPropertiesTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementServerPropertiesTests.java @@ -68,4 +68,10 @@ void slashOfBasePathIsDefaultValue() { assertThat(properties.getBasePath()).isEmpty(); } + @Test + void accessLogsArePrefixedByDefault() { + ManagementServerProperties properties = new ManagementServerProperties(); + assertThat(properties.getAccesslog().getPrefix()).isEqualTo("management_"); + } + }