Chaque cadre de divers cadres produits par Java (comme le printemps, etc.) utilisera différents systèmes de journal. Il y aura certains problèmes avec le mélange de plusieurs journaux différents dans un JVM. Ici, nous allons régler les cadres journaux communs dans le système Java, introduire la relation avec chaque cadre journal centré sur SFL4J et introduire comment gérer divers cadres journaux dans l'environnement de production.
1. Introduction à l'interface
Dans le système Java, il existe principalement deux interfaces du système de journal: SLF4J et le loging Common. Il existe de nombreux frameworks à implémenter, tels que Logback, Log4j, etc.
Bien sûr, bien que les deux soient des interfaces, les deux peuvent également atteindre la sortie de proxy du journal mutuel via des paquets de pont.
La mise en œuvre du journal de l'électricité commune est souvent log4j. Pendant l'initialisation, s'il n'y a pas de spécification spéciale pour qui monter, il sera automatiquement instancié dans l'ordre ci-dessus. Log4JLogger encapsule Log4J Logger et appelle log4j lors de l'impression des journaux.
2. Pont et être ponté dans SLF4J
En tant que définition d'interface, SLF4J peut avoir de nombreux frameworks d'implémentation en bas et peut également prendre en charge d'autres implémentations de journal ou des cadres vers SFL4J. Son implémentation est basée sur différents packages de ponts.
2.1 pont SLF4J
En tant que définition d'interface, il existe de nombreuses implémentations ci-dessous. Le principe de mise en œuvre consiste à effectuer l'initialisation lors de l'obtention d'iloggerfactory. Le processus d'initialisation lie l'objet d'implémentation: chargez toutes les classes qui implémentent StaticLoggerBinder, puis obtenez son singleton. Lors de l'exécution de GetLogger, la méthode de cette classe Singleton est appelée pour obtenir l'objet logger correspondant avec une implémentation spécifique des fonctions de journalisation. S'il y a plusieurs implémentations, liez-en une. Cette situation nécessite la suppression des classes de mise en œuvre des journaux indésirables.
2.2 SLF4J est ponté
La figure ci-dessus montre comment les autres systèmes de journal sont connectés au système de journal SLF4J. Le principe de base est de proxyer leurs systèmes de journal respectifs et de les sortir vers l'interface SFL4J. Pour des implémentations spécifiques, vous pouvez voir la mise en œuvre du package de ponts. Fondamentalement, l'implémentation du journal d'origine a été réimplémentée, et la méthode sous-jacente d'appeler réellement la sortie du journal est de SLF4J.
Seul Jul est une exception, car Java est livré avec la mise en œuvre de JDK, et il est impossible de re-réviser ces classes. Cet endroit implémente un gestionnaire SLF4J basé sur le mécanisme d'extension du gestionnaire Jul, puis écrit le journal à SLF4J. Pour prendre effet, vous devez également modifier JRE / lib / logging.properties pour configurer le nouveau gestionnaire dans la propriété .Handlers. Généralement, la production ne sera pas fait comme ceci.
2.3 Application
Lorsque vous appliquez des projets réels, veillez à ce que le package ponté et ponté ne puisse pas apparaître en même temps, sinon une boucle morte se produira. Par exemple, SFL4J plie à la fois log4j et log4j, alors l'appel de sortie LOG4J pointera vers SLF4J et SLF4J pointe vers LOG4J dans cette boucle. Assurez-vous d'éliminer les packages inutiles.
Suggestions de production: L'implémentation de SLF4J-API montée ne conserve que la bûche de bord, et le pont d'impression en journal supérieur peut exister tous pointant vers SLF4J.
Reportez-vous aux dépendances suivantes et tous les autres packages de journaux sont exclus:
<Dependances> <Dedency> <GroupId> org.slf4j </proupId> <ArtifActid> Slf4j-API </ ArtifactId> <Dersion> 1.7.24 </DERNIFRIENT> </DENDENCENCE> <Dendency> <ProupId> CH.QOS.Logback </proupID> <2011 <dependency> <proupId> org.slf4j </proupId> <Artifactid> jcl-over-slf4j </lefactive> <version> 1.7.14 </-version> </dependency> <dependency> <proupId> org.slf4j </proupatid> <prifictid> LOG4j-over-slf4j </letifactid> <version> 1.7.24 </nuderof> </Dependency> <Dedency> <GroupId> org.slf4j </proupId> <Artifactid> Jul-to-slf4j </etefactId> <version> 1.7.7 </DERNIFRIENT> </DENDENCENCE> </DENDENDENCES>
3. Implémentation du code de test et POM
Code de test
classe publique TestLoggers {/ ** * Slf4j-API -> SLF4J-LOG4J12 -> LOG4J * / PUBLIC VOID TESTSFL4JUPLOG4J () {Org.Slf4J.Logger Logger = LoggerFactory.getLogger (TestLoggers.Class.getName ()); Logger.info ("SLF4J PRINT UTILISATION LOG4J"); } / ** * SLF4J-API -> SLF4J-JCL -> Common-Logging-API (automatiquement à log4j) -> log4j * / public void testslf4j2ComMonLogging () {org.slf4j.logger logger = loggerfactory.getLogger (testLoggers.class.Glgername ()); Logger.Warn ("SLF4J Imprimer à la journalisation commune"); } / ** * 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 Imprimez à SLF4J"); } / ** * jcl-over-slf4j -> sfl4-api -> logback * / public void testCommonLogging2sl4j () {log log = logfactory.getLog (testLoggers.class.getName ()); log.info ("journal commun à slf4j"); } / ** * juil (par défaut de la console) -> juil-à-slf4j -> slf4j -> logback * pour ajouter org.slf4j.bridge.slf4jbridgehandler dans jre / lib / logging.properties * / public void testjul2slf4j () {java.util.logging.logger logger = java.util.logging.logger.getLogger (testLoggers.class.getName ()); Logger.info ("JUL PRINT à SLF4J"); } public static void main (String [] args) {testLoggers Tester = new TestLoggers (); TESTER.TESTSLF4J2COMMONLOGGING (); }}Tester les dépendances Maven
<Dependances> <Dedency> <GroupId> org.slf4j </rombasid> <Artifactid> SLF4J-API </ ArtifactId> <Dersion> 1.7.24 </ Version> </Dependency> <Dedency> <proupId> Comons-Logging </rolpward> <Artifactid> COMMONS-LOGGING-api </ Artifactive> <! - <Dendency> -> <! - <GroupId> org.slf4j </prôdID> -> <! - <artifactId> jcl-over-slf4j </ artifactid> -> <! - <version> 1.7.14 </-version> -> <! - </peedendency> -> <fedency> <proupId> ORG.SLF4J </ GroupId> <TefactId> log4j-over-slf4j </ artifactid> <version> 1.7.24 </ version> </dependency> <! - <Dedency> -> <! - <proupId> org.slf4j </proupId> -> <! - <! - <artifactid> JUL-to-slf4j </ artifactId> -> <! - <! - </Dependency> -> <! - <Dedency> -> <! - <GroupId> ch.qos.logback </proncId> -> <! - <artifactId> Logback-Classic </ Artifactid> -> <! - <version> 1.2.1 </ version> -> <! - </Dedency> -> <! - <Dedency> - -> <! - <proupId> org.slf4j </proupId> -> <! - <artifactId> SLF4J-LOG4J12 </ ArtifactId> -> <! - <De version> 1.7.5 </ Version> -> <! - </ Dependency> -> <Dendency> <prounid> Log4j </proupId> <ArtifActid> log4j </ artifactID> <version> 1.2.17 </ version> </dependency> <dependency> <proupId> org.slf4j </proupId> <ArtifActid> slf4j-jcl </retifactid> <version> 1.7.24 </preinte> </sependency> </dedences>
L'article ci-dessus discute brièvement de l'utilisation de la compatibilité SLF4J avec d'autres systèmes de journal est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.