Cada marco en varios marcos producidos por Java (como Spring, etc.) utilizará diferentes sistemas de registro. Habrá ciertos problemas para mezclar múltiples registros diferentes en un JVM. Aquí resolveremos los marcos de registro comunes en el sistema Java, introduciremos la relación con cada marco de registro centrado en SFL4J e introduciremos cómo administrar varios marcos de registro en el entorno de producción.
1. Introducción a la interfaz
En el sistema Java, hay principalmente dos interfaces del sistema de registro: SLF4J y registro común. Hay muchos marcos para implementar, como logback, log4j, etc.
Por supuesto, aunque ambas son interfaces, las dos también pueden lograr la salida de proxy de registro mutuo a través de paquetes de puentes.
La implementación de registro de la registro común montado es a menudo log4j. Durante la inicialización, si no hay una especificación especial para quién se montará, se instanciará automáticamente en el orden anterior. LOG4JLogger encapsula el registrador de Log4J y llama a LOG4J al imprimir registros.
2. Puente y ser unido en slf4j
Como definición de interfaz, SLF4J puede tener muchos marcos de implementación en la parte inferior, y también puede admitir otras implementaciones o marcos de registro a SFL4J. Su implementación se basa en diferentes paquetes de puentes.
2.1 puente slf4j
Como definición de interfaz, hay muchas implementaciones a continuación. El principio de implementación es realizar la inicialización al obtener iLoggerFactory. El proceso de inicialización une el objeto de implementación: Cargue todas las clases que implementen staticloggerbinder y luego obtengan su singleton. Al ejecutar GetLogger, se llama al método de esta clase Singleton para obtener el objeto Logger correspondiente con implementación específica de funciones de registro. Si hay múltiples implementaciones, entonces vincule una de ellas. Esta situación requiere la eliminación de clases de implementación de registro no deseadas.
2.2 Slf4j está puenteado
La figura anterior muestra cómo otros sistemas de registro están conectados al sistema de registro SLF4J. El principio básico es representar sus respectivos sistemas de registro y generarlos en la interfaz SFL4J. Para implementaciones específicas, puede ver la implementación del paquete Bridge. Básicamente, la implementación del registro original se ha reimplemento, y el método subyacente para llamar a la salida del registro es SLF4J.
Solo Jul es una excepción, porque Java viene con la implementación de JDK, y es imposible volver a revisar esas clases. Este lugar implementa un controlador SLF4J basado en el mecanismo de extensión del controlador JUL y luego escribe el registro en SLF4J. Para entrar en vigencia, también debe modificar jre/lib/logging.properties para configurar el nuevo controlador en la propiedad .handlers. En general, la producción no se hará así.
Aplicación 2.3
Al aplicar proyectos reales, tenga cuidado de que el paquete puente y puente no pueda aparecer al mismo tiempo, de lo contrario ocurrirá un bucle muerto. Por ejemplo, SFL4J une log4j y log4j, luego la llamada de salida log4j apuntará a slf4j, y slf4j puntos a log4j en este bucle. Asegúrese de eliminar paquetes inútiles.
Sugerencias de producción: la implementación de SLF4J-API montado solo retiene logback, y el puente de impresión de registro superior puede existir apuntando a SLF4J.
Consulte las siguientes dependencias, y todos los demás paquetes de registro están excluidos:
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.24</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.1</version> </dependency> <Spendency> <MoupRid> org.slf4j </proupid> <artifactid> jcl-over-slf4j </artifactid> <versión> 1.7.14 </versión> </pendency> <epardency> <proupid> org.slf4j </groupid> <artifactid> log4j-over-slf4j </artifactid> <versersever> <versions 1.7.2.24> </pendency> <pendency> <grupid> org.slf4j </groupid> <artifactid> jul-to-slf4j </arfactid> <version> 1.7.7 </versión> </pendency> </pendencies>
3. Implementación del código de prueba y POM
Código de prueba
clase pública TestLoggers { / ** * slf4j-api-> slf4j-log4j12-> log4j * / public void testSfl4jupplog4j () {org.slf4j.logger logger = loggerFactory.getLogger (testLoggers.class.getName ()); logger.info ("slf4j print use log4j"); } / ** * slf4j-api-> slf4j-jcl-> común-logging-api (automáticamente a log4j)-> log4j * / public void testslf4j2commonlogging () {org.slf4j.logger = logGerFactory.getLogger (testloggers.class.getName ()); logger.warn ("slf4j imprimir a registro común"); } / ** * log4j-over-slf4j-api-> logback-classic * / public void testLog4j2slf4j () {org.apache.log4j.logger logger = org.apache.log4j.logger.getlogger (testLoggers.class.getName ()); logger.info ("log4j imprime a slf4j"); } / ** * jcl-over-slf4j-> sfl4-api-> logback * / public void testCommonlogging2Sl4j () {log log = logFactory.getLog (testLoggers.class.getName ()); log.info ("Common Log to Slf4j"); }/** * jul (console predeterminado)-> jul-to-slf4j-> slf4j-> logback * para agregar org.slf4j.bridge.slf4jbridgehandler en jre/lib/logging.properties */public void testjul2slf4j () {java.util.logging.logger = java.util.logging.logger.getlogger (testLoggers.class.getName ()); logger.info ("Jul imprime a slf4j"); } public static void main (string [] args) {testLoggers tester = new testLoggers (); tester.testslf4j2Commonlogging (); }}Prueba de dependencias maven
<Spendencies> <Spendency> <MoupRId> org.slf4j </groupid> <artifactid> slf4j-api </arfactiD> <versión> 1.7.24 </versión> </pendency> <ependency> <proupId> commons-logging </groupid> <arfactid> commons-logging-api </artactid> </versión> 1.1 </versión </artifactid> commons-logging-api </artactid> </versión> 1.1 </Versión </artesid> <arfactid> Commons-logging-api </artactid> </Versión> </Versión </Versión </artifactid> < <artifactid> log4j-over-slf4j </artifactid> <versión> 1.7.24 </versión> </pendency> <!-<Peeprese>-> <!-<MoupRoMID> org.slf4j </groupid>-> <!-<Atifactid> jul-to-slf4j </artifactid>-> <!-<versión> 1.7.7 </versión>-----------------------------------------------------------------------------------------------------------------------------------------------------------------------) < < </pendency> <pendency> <grupid> org.slf4j </groupid> <artifactid> slf4j-jcl </arfactid> <versions> 1.7.24 </versión> </pendency> </pendencies>
El artículo anterior analiza brevemente el uso de la compatibilidad SLF4J con otros sistemas de registro es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.