Cada estrutura em várias estruturas produzidas pela Java (como a primavera etc.) usará diferentes sistemas de log. Serão certos problemas para misturar vários logs diferentes em uma JVM. Aqui, resolveremos as estruturas de log comuns no sistema Java, introduziremos o relacionamento com cada estrutura de log centralizada no SFL4J e introduzirá como gerenciar várias estruturas de log no ambiente de produção.
1. Introdução à interface
No sistema Java, existem principalmente duas interfaces do sistema de log: SLF4J e Loging Common. Existem muitas estruturas a serem implementadas, como logback, log4j, etc.
Obviamente, embora ambos sejam interfaces, os dois também podem obter saída de proxy de log mútuo através de pacotes de ponte.
A implementação do log do montado em login comum é frequentemente log4j. Durante a inicialização, se não houver especificação especial para quem montar, ela será automaticamente instanciada na ordem acima. O Log4Jlogger encapsula o logger do Log4J e chama Log4J ao imprimir logs.
2. Ponte e sendo ponte em Slf4j
Como definição de interface, o SLF4J pode ter muitas estruturas de implementação na parte inferior e também pode suportar outras implementações ou estruturas de log para SFL4J. Sua implementação é baseada em diferentes pacotes de ponte.
2.1 Slf4j Bridge
Como definição de interface, existem muitas implementações abaixo. O princípio da implementação é executar a inicialização ao obter o ILoggerFactory. O processo de inicialização liga o objeto de implementação: carregue todas as classes que implementam o StaticLoggerBinder e, em seguida, obtenha seu singleton. Ao executar o GetLogger, o método desta classe Singleton é chamado para obter o objeto Logger correspondente com implementação específica de funções de registro. Se houver várias implementações, vinte um deles. Esta situação requer a remoção de classes de implementação de log indesejadas.
2.2 Slf4j está em ponte
A figura acima mostra como outros sistemas de log estão conectados ao sistema de log SLF4J. O princípio básico é proxy seus respectivos sistemas de log e gerá -los para a interface SFL4J. Para implementações específicas, você pode ver a implementação do pacote Bridge. Basicamente, a implementação original do log foi reimplementada, e o método subjacente de chamar a saída do log é para SLF4J.
Somente Jul é uma exceção, porque o Java vem com a implementação do JDK e é impossível rever essas classes. Este local implementa um manipulador SLF4J com base no mecanismo de extensão do manipulador Jul e, em seguida, escreve o log no SLF4J. Para entrar em vigor, você também deve modificar JRE/lib/logging.properties para configurar o novo manipulador na propriedade .Handlers. Geralmente, a produção não será feita assim.
2.3 Aplicação
Ao aplicar projetos reais, tenha cuidado para que o pacote em ponte e a ponte não possa aparecer ao mesmo tempo, caso contrário, ocorrerá um loop morto. Por exemplo, o SFL4J Bridges Log4J e LOG4J, então a chamada de saída LOG4J apontará para SLF4J e o SLF4J aponta para o log4j neste loop. Certifique -se de eliminar pacotes inúteis.
Sugestões de produção: A implementação do Slf4J-API montado apenas mantém o logback e a ponte de impressão de log superior pode existir todos apontando para SLF4J.
Consulte as seguintes dependências e todos os outros pacotes de log são excluídos:
<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> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.14</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.24</version> </dependency> <pendency> <voundid> org.slf4j </groupid> <TRATIFACTID> JUL-SLF4J </ARTIFACTID> <Versão> 1.7.7 </sipers> </dependency> </dependences>
3. Implementação do código de teste e POM
Código de teste
public class TestLoggers { / ** * Slf4j-API-> SLF4J-LOG4J12-> LOG4J * / public void testSfl4JupLog4j () {org.slf4j.Glegger Logger = LoggerFactory.getLogger (TestLoggers.class.getName (); Logger.info ("Slf4j Print Use Log4J"); } /** * slf4j-api --> slf4j-jcl --> common-logging-api (automatically to log4j)--> log4j */ public void testSlf4j2CommonLogging(){ org.slf4j.Logger logger = LoggerFactory.getLogger(TestLoggers.class.getName()); Logger.warn ("Slf4j Print to Common Logging"); } / ** * log4j-over-slf4j-api-> Logback-Classic * / public void testLog4j2slf4j () {org.apache.log4j.logger logger = org.apache.log4j.logger.getLogger (testloggers.cllass.getname (); Logger.info ("LOG4J PRINT para SLF4J"); } / ** * jcl-over-slf4j-> sfl4-api-> logback * / public void testCommonLogging2sl4j () {log log = logFactory.getLog (testloggers.class.getName (); log.info ("Log Common para SLF4J"); }/** * Jul (padrão do console)-> Jul-to-slf4j-> slf4j-> Logback * para adicionar org.slf4j.bridge.slf4jbridgeHandler em jre/lib/logging.properties */public void testjlf4j () {java.util.Lutging.LaGingging */public void testjlf4j () {java.util.Lutging.LaGingging */public void testjlf4j () {java.util.Lutging.LaGingging */public void testjlf4j () {java.util.Lutging.LaGingging */public void testjlf4j () {java.util.Lelil.Lelilging.LaGingging */public void testjlf4j () {java.util.Lutging.LaGingging */público java.util.logging.logger.getLogger (testloggers.class.getName ()); Logger.info ("Jul Print to Slf4J"); } public static void main (string [] args) {testLoggers tester = new TestLoggers (); tester.testslf4j2CommonLogging (); }}Teste dependências do MAVEN
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.24</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> </dependency> <!-<Ependency>-> <!-<roupid> org.slf4j </groupId>-> <!-<TRATIFACTID> jcl-over-slf4j </artifactId>-> <!-<siersy> 1.7.14 </sipers>-> <! <stifactId> log4j-over-slf4j </artifactId> <versão> 1.7.24 </version> </dependency> <!-<pendency>-> <!-<GrupId> org.slf4j </groupfactid>-> <!-<! <!-</dependency>-> <!-<pendency>-> <!-<roupidId> ch.qos.logback </groupId>-> <!-<TRARFACTID> Logback-Classic </ArtifactId>-> <!-<sipery> 1.2.1 </versão> <!-</dependence>-> <! <!-<GrupoId> org.slf4j </groupId>-> <!-<TarifactId> slf4j-log4j12 </artifactId>-> <!-<versão 1.7.5 </sipers>-> <!-</dependency>-> dependência> <Grupid> Log4J </GrupoD> </dependency> <pendency> <voundid> org.slf4j </groupId> <TROTIFACTID> SLF4J-JCL </ArtifactId> <versão> 1.7.24 </versão> </dependency> </dependences>
O artigo acima discute brevemente o uso da compatibilidade do SLF4J com outros sistemas de log é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.