Spring Boot: LoggingApplicationListener que interfiere con el registro del servidor de aplicaciones

Spring Boot inicializa automáticamente el sistema de registro subyacente utilizando elLoggingApplicationListener. Esto es bueno si la aplicación que estoy desarrollando se ejecuta de forma aislada o independiente.

Sin embargo, estoy desarrollando una aplicación web que se implementará en el servidor de aplicaciones WSO2, que ofrece un registro unificado (usando log4j), con características como la administración central del nivel de registro (en tiempo de ejecución a través de la interfaz web), informes comerciales, etc.

Si uso Spring Boot "tal cual", registra todo por sí solo. Mi primer disparo fue, para eliminarspring-boot-starter-logging y agregar manualmenteslf4j-api comoprovided. Esto funciona hasta cierto punto, ya que elLoggingApplicationListener ahora anula la configuración del administrador de registros global proporcionado por WSO2 (e incluso hace que se cierren los apéndices globales).

La única "solución" que se me ocurrió es eliminar al oyente a través de la reflexión. Entonces Spring Boot comienza a comportarse exactamente como debería (iniciar sesión a través del registrador global y no anular los niveles de registro predefinidos, formatos de salida, apéndices, etc.)

Esa "solución" se ve así:

@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {

    public static void main(String... args) {
        SpringApplication.run(MyApp.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        try {
            Field appField = SpringApplicationBuilder.class.getDeclaredField("application");
            appField.setAccessible(true);
            SpringApplication app = (SpringApplication)appField.get(builder);

            Field listenersField = SpringApplication.class.getDeclaredField("listeners");
            listenersField.setAccessible(true);
            List<ApplicationListener<?>> listeners = (List<ApplicationListener<?>>) listenersField.get(app);
            for (int i = listeners.size() - 1; i >= 0; --i) {
                if (listeners.get(i) instanceof LoggingApplicationListener) {
                    listeners.remove(i);
                }
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return builder.sources(MyApp.class);
    }
}

¿Hay alguna solución mejor para mi problema que sea menos hacky que haya pasado por alto durante mi investigación y análisis de código?

Respuestas a la pregunta(2)

Su respuesta a la pregunta