Configuração de Logs com Logback

  1. Introdução

O Logback é um framework de logging que evoluiu do Log4j, construindo sobre uma década de experiência em sistemas de logging industriais. Ele é mais rápido e mais leve do que todas as outras alternativas disponíveis, oferecendo diversas características únicas. O Logback é o framework padrão integrado internamente pelo Spring Boot.

A estrutura do Logback é dividia em três módulos principais:

  • logback-core: Módulo base para os outros dois módulos
  • logback-classic: Versão melhorada do Log4j, com implementação completa da API SLF4J, permitindo intercambialidade com outros sistemas como Log4j ou JDK14 Logging
  • logback-access: Módulo de integração com containers Servlet para acesso aos logs via HTTP
  1. Conceitos Fundamentais

Níveis de Logging

Os níveis de logging são organziados em ordem crescente de severidade:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

Quando um nível é configurado, todas as mensagens com prioridade inferior não serão exibidas. Por exemplo, se o nível for definido como WARN, mensagens dos níveis TRACE, DEBUG e INFO serão ignoradas.

Arquivo de Configuração

O Spring Boot utiliza o Logback como framework padrão de logging. Para customizar a configuração, basta criar um arquivo de configuração externo. O arquivo deve ser colocado no diretório resources com o nome logback-spring.xml ou logback.xml.

A documentação oficial do Spring Boot recomenda utilizar o sufixo -spring no nome do arquivo. Caso deseje utilizar um nome diferente, especifique-o no arquivo application.yaml:

logging:
  config: classpath:meu-arquivo.xml

  1. Estrutura do Arquivo de Configuração

A seguir, apresenta-se um modelo completo de configuração do Logback:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">

    <!-- Definição do contexto da aplicação -->
    <contextName>minha-aplicacao</contextName>

    <!-- Definição de variáveis para reutilização -->
    <property name="diretorio.logs" value="C:/logs" />

    <!-- Formato do log no console (com cores) -->
    <property name="PADRÃO_CONSOLE"
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%magenta(%M)|%cyan(%msg%n)"/>

    <!-- Formato do log em arquivo -->
    <property name="PADRÃO_ARQUIVO"
              value="%date{yyyy-MM-dd HH:mm:ss} |%-5level |%thread |%file:%line |%logger | %M |%msg%n" />

    <!-- Definição do encoding -->
    <property name="CODIFICACAO" value="UTF-8" />

    <!-- Appender para saída no console -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <Pattern>${PADRÃO_CONSOLE}</Pattern>
            <charset>${CODIFICACAO}</charset>
        </encoder>
    </appender>

    <!-- Appender para arquivo de logs INFO -->
    <appender name="ARQUIVO_INFOS" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${diretorio.logs}/app_info.log</file>
        <encoder>
            <pattern>${PADRÃO_ARQUIVO}</pattern>
            <charset>${CODIFICACAO}</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${diretorio.logs}/info/app-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- Appender para arquivo de logs WARN -->
    <appender name="ARQUIVO_WARNINGS" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${diretorio.logs}/app_warn.log</file>
        <encoder>
            <pattern>${PADRÃO_ARQUIVO}</pattern>
            <charset>${CODIFICACAO}</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${diretorio.logs}/warn/app-warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- Appender para arquivo de logs ERROR -->
    <appender name="ARQUIVO_ERROS" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${diretorio.logs}/app_error.log</file>
        <encoder>
            <pattern>${PADRÃO_ARQUIVO}</pattern>
            <charset>${CODIFICACAO}</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${diretorio.logs}/error/app-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- Perfil de desenvolvimento -->
    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="ARQUIVO_INFOS" />
            <appender-ref ref="ARQUIVO_WARNINGS" />
            <appender-ref ref="ARQUIVO_ERROS" />
        </root>
    </springProfile>

    <!-- Perfil de produção -->
    <springProfile name="prod">
        <root level="ERROR">
            <appender-ref ref="ARQUIVO_ERROS" />
        </root>
    </springProfile>

</configuration>

  1. Elementos de Configuração

Elemento <configuration>

É o elemento raiz e possui três atributos principais:

  • scan: Quando definido como true, o arquivo de configuração será recarregado automaticamente quando modificado. O valor padrão é true.
  • scanPeriod: Define o intervalo de tempo para verificar alterações no arquivo de configuração. O valor padrão é 1 minuto.
  • debug: Quando definido como true, exibe mensagens internas do Logback para diagnóstico. O valor padrão é false.

Elemento <contextName>

Define o nome do contexto da aplicação. Cada logger é associado a um contexto, sendo "default" o nome padrão. O contexto pode ser utilizado nos padrões de logging através de %contextName.

Elemento <property>

Define variáveis reutilizáveis na configuração. Possui dois atributos:

  • name: Nome da variável
  • value: Valor da variável

As variáveis são acessadas usando a sintaxe ${nome}.

Elemento <timestamp>

Gera um timestamp que pode ser utilizado na configuração. Atributos:

  • key: Identificador do timestamp
  • datePattern: Formato de data seguindo o padrão SimpleDateFormat
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <timestamp key="horario" datePattern="yyyyMMdd'T'HHmmss"/>
    <contextName>${horario}</contextName>
</configuration>

Elemento <appender>

Define onde e como os logs serão escritos. Atributos:

  • name: Identificador do appender
  • class: Classe que implementa a estratégia de saída

Tipos comuns de appender:

  • ConsoleAppender (ch.qos.logback.core.ConsoleAppender): Escreve logs no console
  • RollingFileAppender (ch.qos.logback.core.rolling.RollingFileAppender): Escreve logs em arquvios com rotação

Elemento <filter>

Filtra mensagens de log baseada em critérios específicos. O LevelFilter filtra por nível de severidade:

  • <level>: Nível de logging a ser filtrado
  • <onMatch>: Ação quando há correspondência (ACCEPT ou DENY)
  • <onMismatch>: Ação quando não há correspondência (ACCEPT ou DENY)

Elemento <rollingPolicy>

Define a estratégia de rotação de arquivos:

  • TimeBasedRollingPolicy: Rotação baseada em tempo
  • SizeAndTimeBasedFNATP: Rotação baseada em tamanho e tempo

Elemento <springProfile>

Permite definir configurações específicas para cada ambiente (dev, prod, etc).

Elemento <logger>

Configura o comportamento de log para pacotes ou classes específicas. Atributos:

  • name: Nome do pacote ou classe
  • level: Nível de logging (TRACE, DEBUG, INFO, WARN, ERROR, OFF)
  • additivity: Define se as mensagens devem ser propagadas para logger pais (padrão: true)

Elemento <root>

É o logger raiz, pai de todos os outros loggers. O atributo level define o nível padrão de logging para toda a aplicação.

  1. Formatos de Pattern

Os padrões de logging suportam os seguintes marcadores:

  • %-5level: Nível de logging com espaçamento
  • %d{pattern}: Data formatada
  • %logger: Nome completo da classe
  • %M: Nome do método
  • %L: Número da linha
  • %thread: Nome da thread
  • %msg: Mensagem de log
  • %n: Nova linha

Tags: logback java Logging spring-boot configuracao

Publicado em 7-19 19:20