Configurando Logback no SpringBoot

O Logback é um framework de registro de eventos (logging) para aplicativos Java. Ele foi desenvolvido como uma evolução do popular framework de logging chamado Log4j, com melhorias e novos recursos. O Logback é amplamente utilizado na comunidade Java devido à sua eficiência, flexibilidade e capacidade de integração com outras bibliotecas e ferramentas.

A principal função do Logback é permitir que os desenvolvedores registrem mensagens e eventos relevantes durante a execução de um aplicativo. Essas mensagens podem variar de informações de depuração a erros críticos. O Logback ajuda os desenvolvedores a gerenciar, armazenar e analisar essas mensagens de forma eficiente.

Principais características e componentes do Logback incluem:

  1. Logger: É a principal classe usada para escrever mensagens de log. Cada classe em um aplicativo possui um logger associado.
  2. Appenders: São os destinos para onde as mensagens de log são enviadas, como arquivos, console, e-mail, banco de dados, etc. O Logback fornece vários tipos de appenders para diferentes necessidades.
  3. Layouts: Determinam o formato em que as mensagens de log são registradas. Por exemplo, um layout pode formatar as mensagens em texto simples, JSON, XML, etc.
  4. Níveis de Logging: Determinam o nível de gravidade das mensagens a serem registradas, como DEBUG, INFO, WARN, ERROR, etc. A configuração de níveis ajuda a controlar quais mensagens são exibidas com base na importância.
  5. Filtros: Permitem controlar quais mensagens são registradas com base em critérios específicos, como tipo de mensagem, origem, entre outros.
  6. Configuração flexível: O Logback oferece uma configuração flexível, permitindo que os desenvolvedores personalizem como as mensagens de log são tratadas, arquivadas e formatadas.

O Logback é amplamente adotado na comunidade Java devido à sua eficiência, baixo consumo de recursos, configuração simples e recursos avançados de logging. É uma escolha popular para logging em aplicativos Java, e muitos frameworks e bibliotecas integraram suporte ao Logback para facilitar a configuração e o uso.

O que é MDC

O MDC (Mapped Diagnostic Context) é uma estrutura de dados que permite adicionar informações adicionais aos logs, como um ID de solicitação, nome do usuário, etc. Isso pode ser útil para rastrear problemas em um ambiente distribuído com vários threads.

Configurando LogBack em um projeto Maven

Para adicionar o MDC ao log do Sl4j no Spring, você precisa seguir os seguintes passos:

1 – Adicionar a dependência do logback-classic no seu projeto:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>
pom.xml

2 – Configure o arquivo logback.xml (ou logback-spring.xml, se você estiver usando o Spring Boot) para incluir o padrão %mdc no padrão de log que você está usando. Por exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
	<included>
		<conversionRule conversionWord="clr"
			converterClass="org.springframework.boot.logging.logback.ColorConverter" />
	</included>

	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%-20.20thread] %-5level %-0.40logger{39} %mdc : %msg%n</pattern>
		</encoder>
	</appender>

	<springProfile name="default">
		<root level="info" additivity="false">
			<appender-ref ref="console" />
		</root>
	</springProfile>
</configuration>
logback-spring.xml

Nesse exemplo, o padrão %mdc é adicionado ao padrão de log, que irá incluir as informações adicionais do MDC.

Adicionando informações ao MDC do Sl4j

Agora que está devidamente configurado é possível adicionar informações extras ao MDC, basta seguir os seguintes passos.

Para adicionar informações ao MDC, você pode usar a classe MDC do Sl4j. Por exemplo:

MDC.put("usuario", "joao");
Main.java

Isso adicionará uma entrada ao MDC com a chave “usuario” e o valor “joao”. Para remover uma entrada do MDC, você pode usar o método MDC.remove("usuario").

Com esses passos, as informações adicionais do MDC serão incluídas nos logs do Sl4j. Isso pode ser útil para rastrear problemas em um ambiente distribuído com vários threads.

Adicionando informações com um interceptor do Spring Boot

Primeiro vamos criar uma classe interceptadora, para adicionar as informações que desejamos no MDC.

package com.artefatox.config;

import java.util.UUID;

import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@Component
public class MdcInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		String requestId = request.getHeader("requestId");
		if(requestId == null || requestId.isBlank()) {
			MDC.put("requestId", UUID.randomUUID().toString());
		} else {
			MDC.put("requestId", requestId);
		}
		
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		MDC.clear();
	}
}
MdcInterceptor.java

Agora precisamos registrar nosso interceptador, para que ele seja executado junto com a nossa aplicação, faremos isso criando uma classe de configuração.

package com.artefatox.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

	private final MdcInterceptor mdcInteceptor;

	public WebConfig(MdcInterceptor mdcInteceptor) {
		this.mdcInteceptor = mdcInteceptor;
	}
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(mdcInteceptor);
	}
}
WebConfig.java

Com esses passos, o MDC será configurado para todas as requisições no seu Spring Boot application. Note que a chave “requestId” foi usada como exemplo para o MDC, você pode alterá-la e adicionar as informações que você precisa.

Conheça mais publicações sobre Spring Boot clicando aqui

Mauricio Lima
Mauricio Lima

Bacharel em Ciência da Computação, profissional dedicado ao desenvolvimento de software e entusiasta da tecnologia.

Artigos: 65