java - org - ¿Cuál es el problema con el algoritmo de descubrimiento en tiempo de ejecución de Apache Commons Logging?
spring logging example (4)
¿Por qué? ¿Cuál es el problema con su algoritmo de descubrimiento de tiempo de ejecución? ¿Actuación?
No, no es el rendimiento, es un dolor de cargador de clases . El proceso de descubrimiento de JCL se basa en hacks de cargador de clases para encontrar el marco de trabajo de registro en tiempo de ejecución, pero este mecanismo genera numerosos problemas, incluido un comportamiento inesperado, problemas de carga de clases difíciles de depurar que resultan en una mayor complejidad. Esto es muy bien capturado por Ceki (el autor de Log4J, SLF4J y Logback) en Think again antes de adoptar la API de registro de recursos comunes (que también menciona problemas de pérdida de memoria observados con JCL).
Y esta es la razón por la cual SLF4J, que usa enlaces estáticos, ha sido creado.
Como Ceki es el autor de SLF4J, podría pensar que sus artículos son parciales pero, créame, no lo son y está proporcionando muchas referencias (evidencias) para probar su punto.
Para resumir:
- Sí, se sabe que JCL está roto, mejor aléjate de él.
- Si desea utilizar una fachada de registro (no todos los proyectos lo necesitan), use SLF4J.
- SLF4J proporciona un puente JCL-to-SLF4J para frameworks que todavía usan JCL como Spring :(
- Encuentro que Logback, el sucesor de Log4J, es una implementación de registro superior.
- Logback implementa de forma nativa la API SLF4J. Esto significa que si está utilizando Logback, en realidad está usando la API SLF4J.
Ver también
Dave Syer (SpringSource) writes en su blog:
Desafortunadamente, lo peor del registro de commons, y lo que lo ha hecho impopular con las nuevas herramientas, es también el algoritmo de descubrimiento de tiempo de ejecución.
¿Por qué? ¿Cuál es el problema con su algoritmo de descubrimiento de tiempo de ejecución? ¿Actuación?
El registro de Commons contiene lógica para determinar en tiempo de ejecución si se usa log4j o java.util.logging. *.
Ese código solía estar roto, esencialmente solo trabajando con JUL.
En base a las experiencias con esto, se escribió slf4j que usa enlace estático (o se usa, no estoy seguro con la versión 1.6) para elegir el marco apropiado para usar log4j, JUL o Log4j fork logback (y más), e incluye un puente para permitir que el código de registro de Commons existente use slf4j de forma transparente.
Si puedes, entonces ve por slf4j.
El registro de Commons es una fachada de registro ligero que se coloca en la parte superior de la API de registro de gran peso sea log4j , java.util.logging u otra API de registro compatible.
El algoritmo de descubrimiento es lo que usa el registro de recursos comunes para determinar qué API de registro utiliza en tiempo de ejecución para que pueda dirigir las llamadas de registro a través de su API a la API de registro subyacente. El beneficio de esto es que si desea crear una biblioteca que sí lo hace, no desea vincular a los usuarios de su biblioteca a ningún sistema de registro de peso pesado en particular. Las personas que llaman a su código pueden configurar el registro a través de log4j, java.util.logging, etc. y el registro de commons se reenviará a esa API en tiempo de ejecución.
Dificultades comunes para el registro de bienes comunes:
- Aunque no lo uses, una biblioteca de la que dependas puede ser obligatoria, por lo que debes incluirla en tu classpath de todos modos.
- Ejecuta el algoritmo de descubrimiento para cada cargador de clases que desea iniciar sesión, lo que puede producir resultados no deseados, así que asegúrese de poner commons-logging.jar en el cargador de clases correcto.
- Mayor complejidad que el marco de registro subyacente.
- Menos características que subyacen al marco de registro.
Una mayor complejidad percibida, así como la imprevisibilidad en jerarquías de clase complejas sin ningún beneficio percibido, agitan a los usuarios de la tala de objetos comunes. Teniendo en cuenta también que esta opción puede ser forzada, no hace que los usuarios sean comprensivos. Consulte este artículo para obtener un argumento convincente contra el uso del registro de recursos comunes.
No puedo hablar sobre el aspecto "impopular", solo puedo hablar por mí mismo:
Commons Logging es una fachada por encima de cualquier marco de trabajo "real" que pueda ser: Log4j, Logback o lo que sea.
La idea de una fachada de registro es que su aplicación obtenga la flexibilidad para decidir en el tiempo de ejecución con qué implementación de registro quiere trabajar. Las fachadas son lo suficientemente inteligentes como para encontrar implementaciones de registro en tiempo de ejecución.
Mis aplicaciones Java anteriores usan Log4j, directamente. Funciona bien, no veo la necesidad de cambiarlos. Mis aplicaciones Java más nuevas probablemente usarán Logback. Creo que la capacidad de elegir dinámicamente un marco de trabajo de registro es algo que ninguna de mis aplicaciones necesitará jamás. Por supuesto, el kilometraje de otras personas puede variar.
EDITAR: Parece que estaba equivocado acerca de la lógica de Commons Logging. Los enlaces proporcionados por @Pascal Thivent, especialmente el primero, explican esto mucho mejor.