Introdução ao SLF4J

Introdução ao SLF4J

1. Visão geral

Fachada de registro simples para Java (abreviado SLF4J) - atua como umfacade para diferentes estruturas de registro (por exemplo, java.util.logging, logback, Log4j). Ele oferece uma API genérica, tornando o registro independente da implementação real.

Isso permite que diferentes estruturas de registro coexistam. Também ajuda a migrar de uma estrutura para outra. Por fim, além da API padronizada, também oferece algum "açúcar sintático".

Este artigo discutirá as dependências e a configuração necessárias para integrar o SLF4J ao Log4j2, Logback, Log4J2 e Jakarta Commons Logging. Mais sobre cada uma dessas implementações, você pode ler no artigoIntroduction to Java Logging.

2. A configuração Log4j2

Para usar SLF4J com Log4j2, você deve adicionar as seguintes bibliotecas apom.xml:


    org.apache.logging.log4j
    log4j-api
    2.7


    org.apache.logging.log4j
    log4j-core
    2.7


    org.apache.logging.log4j
    log4j-slf4j-impl
    2.7

A versão mais recente pode ser encontrada aqui:log4j-api,log4j-core,log4j-slf4j-impl.

A configuração de log real está aderindo à configuração nativa do Log4j 2. Vamos ver como a instânciaLogger é criada:

public class SLF4JExample {

    private static Logger logger = LoggerFactory.getLogger(SLF4JExample.class);

    public static void main(String[] args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}

Observe queLoggereLoggerFactory pertencem ao pacoteorg.slf4j. Um exemplo de projeto, rodando com a configuração explicada está disponívelhere.

3. A configuração de logback

Para usar SLF4J com Logback, você não precisa adicionar SLF4J ao seu classpath. O logback já está usando o SLF4J. É considerada a implementação de referência. Precisamos apenas incluir a biblioteca Logback:


    ch.qos.logback
    logback-classic
    1.1.7

A versão mais recente pode ser encontrada aqui:logback-classic.

A configuração é específica do Logback, mas funciona perfeitamente com o SLF4J. Com as dependências e a configuração adequadas, o mesmo código das seções anteriores pode ser usado para lidar com o log.

4.The Log4j Setup

Nas seções anteriores, abordamos um caso de uso em que o SLF4J “fica” no topo da implementação de registro específica. Usado assim, abstrai completamente a estrutura subjacente.

Há casos em que uma solução de registro existente não pode ser substituída, por exemplo devido a requisitos de terceiros. Isso, no entanto, não significa que o projeto seja "condenado" apenas à estrutura já usada.

O SLF4J pode ser configurado como uma ponte, onde as chamadas para uma estrutura existente são redirecionadas para ela. Vamos adicionar as dependências necessárias para criar uma ponte para Log4j:


    org.slf4j
    log4j-over-slf4j
    1.7.21

Com a dependência em vigor (verifique o último emlog4j-over-slf4j), todas as chamadas para Log4j serão redirecionadas para SLF4J. Considere oofficial documentation para aprender mais sobre como fazer a ponte entre as estruturas existentes.

Assim como nas outras estruturas, o Log4j pode servir como uma implementação subjacente. Vamos adicionar as dependências necessárias:


    org.slf4j
    slf4j-log4j12
    1.7.21


    log4j
    log4j
    1.2.17

A versão mais recente pode ser encontrada aqui paraslf4j-log4j12elog4j. Um projeto exemplar, configurado da maneira explicada está disponívelhere.

5. JCL Bridge Setup

Nas seções anteriores, mostramos como a mesma base de código pode ser usada para dar suporte ao log usando diferentes implementações. Embora essa seja a principal promessa e força do SLF4J, também é o objetivo da JCL (Jakarta Commons Logging ou Apache Commons Logging).

JCL é, por suas intenções, uma estrutura semelhante ao SLF4J. A principal diferença é que a JCL resolve a implementação subjacente durante o tempo de execução por meio de um sistema de carregamento de classe. Essa abordagem é considerada problemática nos casos em que há carregadores de classes personalizados em jogo.

SLF4J resolve suas ligações em tempo de compilação. É percebido como mais simples, mas poderoso o suficiente.

Felizmente, duas estruturas podem trabalhar juntas no modo bridge:


    org.slf4j
    jcl-over-slf4j
    1.7.21

A última versão de dependência pode ser encontrada aquijcl-over-slf4j.

Como nos outros casos, a mesma base de código funcionará perfeitamente. Um exemplo de um projeto completo executando esta configuração está disponívelhere.

6. MaisSLF4J Goodness

O SLF4J fornece informações adicionais que podem tornar o registro mais eficiente e o código mais legível. Por exemplo, o SLF4J fornece uma interface muito útil para trabalhar com parâmetros:

String variable = "Hello John";
logger.debug("Printing variable value: {}", variable);

Aqui está o exemplo de código do Log4j que faz a mesma coisa:

String variable = "Hello John";
logger.debug("Printing variable value: " + variable);

Como você pode ver, Log4j concatenaráStrings independentemente do nível dedebug estar habilitado ou não. Em aplicativos de alta carga, isso pode causar problemas de desempenho. SLF4J concatenaráStrings apenas quando o níveldebug estiver habilitado. Para fazer o mesmo com o Log4J, você precisa adicionar um bloco extraif que verificará se o níveldebug está habilitado ou não:

String variable = "Hello John";
if (logger.isDebugEnabled()) {
    logger.debug("Printing variable value: " + variable);
}

O SLF4J padronizou os níveis de log diferentes para as implementações específicas. O nível de logFATAL foi eliminado (foi introduzido no Log4j) com base na premissa de que em uma estrutura de log, não devemos decidir quando um aplicativo deve ser encerrado.

Os níveis de registro usados ​​sãoERROR, WARN, INFO, DEBUG, TRACE. Você pode ler mais sobre como usá-los no artigoIntroduction to Java Logging.

7. Conclusão

O SLF4J ajuda na alternância silenciosa entre estruturas de log. É simples, mas flexível e permite melhorias de legibilidade e desempenho.

Como de costume, o código pode ser encontradoover on GitHub. Além disso, estamos nos referindo a dois outros projetos dedicados a artigos diferentes, mas contendo configurações de log discutidas,hereehere