starter mkyong logger how example java spring logging spring-boot wso2carbon

java - mkyong - spring logging example



Spring Boot: LoggingApplicationListener interfiere con el registro de Application Server (1)

gracias por su publicación es muy útil. Tuve el mismo problema con Websphere Application Server: después de inicializar el contexto de arranque de primavera no tenía más registros. Esta solución es equivalente pero menos sucia anulando el método de ejecución de SpringBootServletInitializer:

@Override protected WebApplicationContext run(SpringApplication application) { Collection<ApplicationListener<?>> listeners = new ArrayList<>(); for (ApplicationListener<?> listener: application.getListeners()) { if (!(listener instanceof LoggingApplicationListener)) { listeners.add(listener); } } application.setListeners(listeners); return super.run(application); }

Spring Boot inicializa automáticamente el sistema de registro subyacente utilizando LoggingApplicationListener . Esto es algo bueno si la aplicación que estoy desarrollando se ejecuta 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 funciones como la administración central de niveles de registro (en tiempo de ejecución a través de la interfaz web), informes comerciales, etc.

Si utilizo Spring Boot "tal cual", registra todo completamente por sí mismo. Mi primer intento fue eliminar spring-boot-starter-logging y spring-boot-starter-logging manual slf4j-api como se slf4j-api . Esto funciona en cierta medida, ya que LoggingApplicationListener ahora anula la configuración del gestor de registro global proporcionado por WSO2 (e incluso hace que los appenders globales se cierren).

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 (registrando a través del registrador global y no anulando los niveles de registro predefinidos, formatos de salida, appenders, 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 a mi problema que sea quizás menos hacky que pueda haber pasado por alto durante mi investigación y análisis de código?