A configuração inadequada do Filebeat pode levar a problemas de duplicação de logs e falhas na saída de dados. Este artigo aborda dois cenários comuns e suas respectivas correções.
Cenário 1: Procsesos Filebeat Múltiplos Devido à Configuração do Supervisor
Sintoma: Monitoramento de Elasticsearch indicando um aumento incomum no volume de requisições. Ao investigar os logs, uma única requisição aparece múltiplas vezes.
Causa Raiz: Vários processos Filebeat rodando na mesma máquina, cada um enviando o mesmo log. Isso ocorreu devido a uma configuração do Supervisor que, ao atualizar sua própria configuração, não encerrava processos Filebeat existentes, permitindo que novos processos fossem iniciados repetidamente.
Configuração Problemática (Supervisor):
[program:filebeat_process]
command=sh /etc/supervisord.d/start_filebeat.sh
process_name=filebeat_process
redirect_stderr=true
stdout_logfile=/tmp/filebeat_process.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=3
autorestart=true
startsecs=3
startretries=3
start_filebeat.sh
#!/bin/bash
/opt/soft/filebeat-7.5.1-linux-x86_64/filebeat -c /opt/soft/filebeat-7.5.1-linux-x86_64/filebeat.yml
Configuração Correta (Supervisor): A linha command deve apontar diretamente para o executável do Filebeat, sem um script intermediário que possa ser chamado múltiplas vezes.
[program:filebeat_process]
command=/opt/soft/filebeat-7.5.1-linux-x86_64/filebeat -c /opt/soft/filebeat-7.5.1-linux-x86_64/filebeat.yml
process_name=filebeat_process
redirect_stderr=true
stdout_logfile=/tmp/filebeat_process.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=3
autorestart=true
startsecs=3
startretries=3
Procedimento de Correção:
- Parar o serviço do Supervisor para evitar que processos antigos sejam reiniciados automaticamente.
- Identificar e encerrar todos os processos Filebeat redundantes.
- Atualizar a configuração do Supervisor.
- Iniciar o serviço do Filebeat através do Supervisor.
# Parar o Filebeat gerenciado pelo Supervisor
ansible all_servers -m shell -a "supervisorctl stop filebeat_process"
# Encerrar processos Filebeat órfãos
ansible all_servers -m shell -a "ps -ef | grep filebeat | grep -v grep | awk '{print \$2}' | xargs -I {} kill -9 {}"
# Atualizar a configuração do Supervisor
ansible all_servers -m shell -a "supervisorctl update"
# Iniciar o Filebeat
ansible all_servers -m shell -a "supervisorctl start filebeat_process"
Cenário 2: Múltiplos Destions de Saída na Configuração do Filebeat
Sintoma: Erro ao iniciar o Filebeat com a mensagem: Exiting: error unpacking config data: more than one namespace configured accessing 'output' (source:'/opt/soft/filebeat-7.5.1-linux-x86_64/filebeat.yml').
Causa Raiz: A configuração do Filebeat permite apenas um destino de saída principal (seja Logstash ou Elasticsearch). Tentar configurar ambos diretamente na seção output gera um conflito.
Configuração Problemática (Filebeat):
output:
logstash:
hosts: ["1.1.1.1:10515"]
when.not.contains:
tags: "sys-log"
elasticsearch:
hosts: ["2.2.2.2:9200"]
username: "xxx"
password: "xxx"
indices:
- index: "sys-log-%{[agent.version]}-%{+yyyy.MM}"
when.contains:
tags: "sys-log"
Solução: Para enviar dados para destinos diferentes com base em condições, é necessário rodar instâncias separadas do Filebeat. Cada instância será configurada com um único destino de saída.
Exemplo de Configuração para duas instâncias:
- Instância 1 (Saída para Logstash): Arquivo
filebeat_logstash.yml
filebeat.inputs:
- type: log
paths:
- /var/log/app.log
fields:
source: "app"
fields_under_root: true
tags: "app-log"
output:
logstash:
hosts: ["1.1.1.1:10515"]
loadbalance: true
- Instância 2 (Saída para Elasticsearch): Arquivo
filebeat_elasticsearch.yml
filebeat.inputs:
- type: log
paths:
- /var/log/system.log
fields:
source: "system"
fields_under_root: true
tags: "sys-log"
output:
elasticsearch:
hosts: ["2.2.2.2:9200"]
username: "xxx"
password: "xxx"
indices:
- index: "sys-log-%{[agent.version]}-%{+yyyy.MM}"
Cada uma dessas configurações seria gerenciada por um processo separado do Filebeat, possivelmente via Supervisor, garantindo que cada um tenha seu próprio destino de saída definido.