Em arquiteturas de microsserviços, onde múltiplos instâncias de um serviço podem ser distribuídas em diferentes máquinas ou contêineres, o monitoramento e a análise de logs se tornam um desafio. A dificuldade reside em coletar e visualizar logs que estão espalhados por diversas fontes. Para resolver isso, a agregação de logs é essencial. Este artigo demonstra como integrra uma aplicação Spring Boot com Graylog, uma ferramenta leve para agregação e análise de logs.
Implantação do Graylog
A maneira mais prática de implantar o Graylog e suas dependências (MongoDB e Elasticsearch) é através do Docker Compose. Crie um arquivo docker-compose.yml com o seguinte conteúdo:
version: '3'
services:
mongo:
image: mongo:4.2
networks:
- graylog
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true -Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 1g
networks:
- graylog
graylog:
image: graylog/graylog:4.2
environment:
- GRAYLOG_PASSWORD_SECRET=seu_segredo_de_senha
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
- GRAYLOG_HTTP_EXTERNAL_URI=http://seu_ip_do_servidor:9009/ # Lembre-se de substituir 'seu_ip_do_servidor'
entrypoint: /usr/bin/tini -- wait-for-it.sh elasticsearch:9200 -- /docker-entrypoint.sh
networks:
- graylog
restart: always
depends_on:
- mongo
- elasticsearch
ports:
- "9009:9000" # Porta externa:interna para acesso à UI do Graylog
- "1514:1514" # Porta para GELF TCP
- "1514:1514/udp" # Porta para GELF UDP
- "12201:12201" # Porta para GELF TLS
- "12201:12201/udp" # Porta para GELF UDP TLS
networks:
graylog:
driver: bridge
No arquivo docker-compose.yml, substitua seu_ip_do_servidor pelo endereço IP real do servidor onde o Graylog será executado. A porta 9009 foi escolhida para evitar conflitos, mas você pode ajustá-la conforme necessário. Execute docker-compose up -d para iniciar os contêineres.
Após a inicialização, acesse a interface do Graylog através de http://seu_ip_do_servidor:9009. O login padrão é admin com a senha admin (derivada do GRAYLOG_ROOT_PASSWORD_SHA2 se você usar o padrão ou a sua senha SHA2 personalizada).
Em seguida, configure um "Input" no Graylog. Navegue até System -> Inputs. Selecione GELF UDP na lista de tipos de input e clique em Launch new input. Dê um título descritivo (por exemplo, "AppLogs GELF UDP") e salve. Não é necessário alterar outras configurações neste momento.
Integração com Spring Boot
Crie um novo projeto Spring Boot. O Spring Boot utiliza o Logback como framework de log padrão. Para enviar logs para o Graylog, adicionaremos a dependência logback-gelf ao seu projeto:
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>logback-gelf</artifactId>
<version>3.0.0</version>
</dependency>
Crie um arquivo src/main/resources/logback.xml e configure-o para usar o appender GELF:
<configuration>
<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
<!-- Endereço do servidor Graylog -->
<graylogHost>seu_ip_do_servidor</graylogHost>
<!-- Porta do Input GELF UDP configurado no Graylog -->
<graylogPort>12201</graylogPort>
<!-- Tamanho máximo do chunk GELF (em bytes) -->
<maxChunkSize>508</maxChunkSize>
<!-- Ativa a compressão GZIP -->
<useCompression>true</useCompression>
<encoder class="de.siegmar.logbackgelf.GelfEncoder">
<!-- Inclui a mensagem original do log -->
<includeRawMessage>false</includeRawMessage>
<!-- Inclui marcadores do Logback -->
<includeMarker>true</includeMarker>
<!-- Inclui dados MDC (Mapped Diagnostic Context) -->
<includeMdcData>true</includeMdcData>
<!-- Inclui dados do chamador (pode ter impacto na performance) -->
<includeCallerData>false</includeCallerData>
<!-- Inclui a causa raiz de exceções -->
<includeRootCauseData>false</includeRootCauseData>
<!-- Inclui o nome do nível do log (ex: INFO, ERROR) -->
<includeLevelName>true</includeLevelName>
<!-- Padrão para mensagens curtas -->
<shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
<pattern>%m%nopex</pattern>
</shortPatternLayout>
<!-- Padrão para mensagens completas (detalhadas) -->
<fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d - [%thread] %-5level %logger{35} - %msg%n</pattern>
</fullPatternLayout>
<!-- Configura campos estáticos adicionais, como o nome da aplicação -->
<staticField>appName:meu_servico</staticField>
<staticField>environment:producao</staticField>
</encoder>
</appender>
<!-- Configuração do root logger para usar o appender GELF -->
<root level="INFO">
<appender-ref ref="GELF" />
</root>
</configuration>
Substitua seu_ip_do_servidor no logback.xml pelo IP do seu servidor Graylog e ajuste o valor de appName para o nome do seu serviço. Após configurar o arquivo, inicie sua aplicação Spring Boot.
Visualização e Busca de Logs
Com a aplicação em execução, os logs serão enviados para o Graylog. Acesse a interface do Graylog e navegue até a seção Search. Você poderá ver os logs recebidos em tempo real.
Ao clicar em uma entrada de log, um painel lateral será exibido detalhando todos os campos extraídos, incluindo os campos estáticos definidos (como appName) e os campos padrão do GELF.
O Graylog oferece uma poderosa linguagem de busca para filtrar seus logs. Abaixo estão alguns exemplos de como realizar buscas:
- Busca por termo:
pedido - Busca exata:
"ID do pedido: 12345" - Busca por campo específico:
message:httpoulevel_name:ERROR - Busca em múltiplos campos:
message:(servico_cliente servico_pagamento) - Busca com múltiplos critérios:
message:login AND level_name:INFO - Busca combinando condições:
(message:autenticacao OR message:autorizacao) AND level_name:WARN - Busca por IP de origem:
source:192.168.1.100
Para consultas mais avançadas e personalizadas, consulte a documentação oficial do componente logback-gelf e a documentação de busca do Graylog.