spring-bootspring-boot-actuatorundertowaccess-log

How to disable management context access log in Spring Boot using undertow


I'm using Spring Boot 2.2.4 with embedded Undertow. I've enabled the access log using server.underdow.accesslog.enabled=true and everything works as expected.

I'm utilizing the actuator endpoints on a different port which sets up a child context. I do not want requests to the actuator to be logged. Currently they automatically go to management_access.log where access. is the prefix of my main access log. Any ideas on how to disable that access log? I know Spring is creating a separate WebServer via Factory for the actuator context, but I haven't found a way to customize the factory.


Solution

  • I found my own answer (spent way too much time doing it). It's a little bit of a hack, but it works:

    New configuration class: foo.ManagementConfig

    package foo;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
    import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.context.annotation.Bean;
    @ManagementContextConfiguration
    public class ManagementConfig {
    
        @Bean
        WebServerFactoryCustomizer<UndertowServletWebServerFactory> actuatorCustomizer(@Value("${management.server.port}") int managementPort) {
            return factory -> {
                if (managementPort == factory.getPort()) {
                    factory.setAccessLogEnabled(false);
                }
            };
        }
    }
    

    Created resources/META-INF/spring.factories so that it gets picked up by the ManagementContext:

    org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration=foo.ManagementConfig
    

    The part that's a bit of a hack is the if statement. It would have been great if it applied only to the management context, but for some reason it's trying to apply to both. With the if statement, it just doesn't do anything for the primary context.

    This would have unintended consequences if management.server.port was undefined or if it was the same as the primary context.