- 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
- 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
- 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>
- 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.
- 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