Análise de logs com journalctl, logrotate e stack ELK
1. Introdução ao ecossistema de logs no Linux
1.1. Importância da centralização e análise de logs para diagnóstico e segurança
Em ambientes Linux, os logs são a principal fonte de informação para diagnóstico de falhas, auditoria de segurança e monitoramento de desempenho. Sem uma estratégia adequada de coleta e análise, problemas críticos podem passar despercebidos, comprometendo a disponibilidade e a integridade dos sistemas. A centralização de logs permite correlacionar eventos de múltiplos servidores, facilitando a identificação de padrões e anomalias.
1.2. Visão geral das ferramentas: journald (systemd), logrotate e stack ELK
O ecossistema moderno de logs no Linux combina três componentes fundamentais:
- journald: sistema de logging nativo do systemd, que coleta logs binários estruturados do kernel, serviços e aplicações.
- logrotate: utilitário clássico para rotação, compressão e remoção automática de arquivos de log, evitando o consumo excessivo de disco.
- Stack ELK (Elasticsearch, Logstash, Kibana): plataforma poderosa para armazenamento, processamento e visualização de logs em larga escala.
1.3. Diferença entre logs locais (journalctl) e logs centralizados (ELK)
Enquanto o journalctl é ideal para consultas rápidas em um único servidor, o stack ELK oferece busca full-text, agregação de dados de múltiplas fontes e dashboards interativos. A combinação das duas abordagens permite desde análises pontuais até monitoramento corporativo.
2. Gerenciamento de logs com journalctl
2.1. Comandos essenciais: filtragem por unidade, prioridade, data e boot
O journalctl é a interface principal para consultar logs do systemd. Exemplos práticos:
# Logs de uma unidade específica
journalctl -u nginx.service
# Logs com prioridade error ou superior
journalctl -p err
# Logs desde a última inicialização
journalctl -b -1
# Logs de um intervalo de tempo
journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 23:59:59"
2.2. Exportação e consulta avançada: saída em JSON, uso de --output e --since
Para integração com outras ferramentas, a saída em JSON é essencial:
# Exportar logs em formato JSON
journalctl -u sshd.service --output=json-pretty --since "1 hour ago"
# Campos específicos com --output=verbose
journalctl -u cron.service --output=verbose --no-pager
2.3. Configuração do journald: tamanho máximo, persistência e rotação nativa
O arquivo /etc/systemd/journald.conf controla o comportamento do journald:
[Journal]
Storage=persistent
SystemMaxUse=500M
SystemMaxFileSize=100M
MaxRetentionSec=2weeks
ForwardToSyslog=yes
Após alterações, reinicie o serviço:
systemctl restart systemd-journald
3. Rotação e retenção de logs com logrotate
3.1. Estrutura de configuração: diretório /etc/logrotate.d/ e diretivas comuns
O logrotate gerencia arquivos de log texto. As configurações ficam em /etc/logrotate.d/:
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 nginx adm
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
3.2. Exemplos práticos: configurar rotação para logs do Apache, Nginx e syslog
Para logs do Apache:
/var/log/apache2/*.log {
weekly
rotate 4
compress
maxsize 50M
sharedscripts
postrotate
systemctl reload apache2 > /dev/null 2>&1 || true
endscript
}
Para syslog tradicional:
/var/log/syslog {
rotate 12
weekly
compress
missingok
notifempty
postrotate
systemctl restart rsyslog > /dev/null 2>&1 || true
endscript
}
3.3. Teste e depuração: execução manual com -d (debug) e verificação de logs girados
Teste a configuração sem executar a rotação:
logrotate -d /etc/logrotate.d/nginx
Forçar a rotação manualmente:
logrotate -f /etc/logrotate.d/nginx
Verifique os logs girados:
ls -lh /var/log/nginx/
4. Introdução ao stack ELK (Elasticsearch, Logstash, Kibana)
4.1. Componentes e funções: Elasticsearch (armazenamento/busca), Logstash (processamento), Kibana (visualização)
- Elasticsearch: banco de dados NoSQL baseado em Lucene, otimizado para busca e agregação de dados textuais.
- Logstash: pipeline de processamento de dados que recebe, transforma e envia logs para o Elasticsearch.
- Kibana: interface web para criar dashboards, gráficos e alertas sobre os dados armazenados no Elasticsearch.
4.2. Instalação básica do stack em um servidor Linux (repositórios oficiais)
Adicione os repositórios e instale os pacotes:
# Importar chave GPG
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# Adicionar repositório
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list
# Instalar
apt update && apt install elasticsearch logstash kibana
Configure a memória do Elasticsearch em /etc/elasticsearch/jvm.options:
-Xms2g
-Xmx2g
4.3. Primeiros passos: envio de logs locais para o Logstash via filebeat ou syslog
Instale o Filebeat para enviar logs do sistema:
apt install filebeat
Configure /etc/filebeat/filebeat.yml:
filebeat.inputs:
- type: log
paths:
- /var/log/syslog
- /var/log/*.log
output.logstash:
hosts: ["localhost:5044"]
5. Configuração do Logstash e ingestão de logs
5.1. Pipelines de entrada: input (file, syslog, beats) e filtros (grok, mutate, date)
Exemplo de pipeline /etc/logstash/conf.d/nginx.conf:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
mutate {
convert => { "response" => "integer" }
convert => { "bytes" => "integer" }
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx-logs-%{+YYYY.MM.dd}"
}
}
5.2. Parsing de logs comuns: extração de campos de logs do Apache e journald
Para logs do Apache:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
}
}
5.3. Saída para Elasticsearch: definição de índices e templates
Configure templates para otimizar o mapeamento:
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "apache-logs-%{+YYYY.MM.dd}"
template => "/etc/logstash/templates/apache.json"
template_name => "apache"
template_overwrite => true
}
}
6. Visualização e análise com Kibana
6.1. Criação de índices e descoberta de dados (Discover)
Acesse Kibana em http://localhost:5601, vá em Stack Management > Index Patterns e crie um padrão nginx-logs-*. No Discover, filtre por campos como response: 500 para encontrar erros.
6.2. Construção de dashboards: gráficos de barras, linhas do tempo e tabelas
Crie visualizações no Visualize Library:
- Gráfico de barras: contagem de requisições por
clientip. - Linha do tempo: número de erros 4xx/5xx ao longo do tempo.
- Tabela: top 10 URLs mais acessadas.
Combine as visualizações em um Dashboard.
6.3. Alertas e monitoramento: uso de Watcher (Elasticsearch) ou Kibana Alerting
No Kibana 8.x, vá em Stack Management > Alerts e crie uma regra:
Rule: Threshold
Index: nginx-logs-*
Condition: response >= 500
Schedule: Every 5 minutes
Actions: Email, Slack
7. Integração de journalctl com ELK
7.1. Envio de logs do journald via journalctl --output=json para Logstash
Crie um script que envia logs continuamente:
#!/bin/bash
journalctl -f --output=json | while read line; do
echo "$line" | nc localhost 5050
done
Configure o Logstash para receber na porta 5050 com input tcp:
input {
tcp {
port => 5050
codec => json
}
}
7.2. Uso de systemd-journal-remote para coleta remota de logs
Instale o pacote:
apt install systemd-journal-remote
Configure o receptor em /etc/systemd/journal-remote.conf:
[Remote]
Seal=false
SplitMode=host
ServerKeyFile=/etc/ssl/private/journal-remote.pem
ServerCertificateFile=/etc/ssl/certs/journal-remote.pem
7.3. Exemplo prático: pipeline completo com filtro grok para logs do systemd
Pipeline Logstash para logs do journald:
input {
beats {
port => 5044
}
}
filter {
if [fields][service] == "systemd" {
grok {
match => { "message" => "%{SYSLOG5424PRI}%{SYSLOG5424SD} %{SYSLOG5424MSG}" }
}
mutate {
add_field => { "service_name" => "%{[fields][unit]}" }
}
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "systemd-logs-%{+YYYY.MM.dd}"
}
}
8. Boas práticas, manutenção e troubleshooting
8.1. Estratégias de retenção: balanceamento entre armazenamento e necessidade de auditoria
Defina políticas de ciclo de vida no Elasticsearch (ILM):
PUT _ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": { "min_age": "0d", "actions": { "rollover": { "max_size": "50GB" } } },
"delete": { "min_age": "30d", "actions": { "delete": {} } }
}
}
}
8.2. Segurança: criptografia de transporte (TLS) e controle de acesso aos índices
Habilite TLS no Elasticsearch:
# Gerar certificados
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --pem
# Configurar em elasticsearch.yml
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true
Crie usuários e atribua permissões no Kibana:
PUT _security/role/logs_admin
{
"indices": [ { "names": ["*"], "privileges": ["all"] } ]
}
8.3. Troubleshooting comum: logs perdidos, alto consumo de disco e lentidão no Elasticsearch
- Logs perdidos: verifique se o Filebeat está rodando (
systemctl status filebeat) e se a porta 5044 está aberta. - Alto consumo de disco: ajuste
SystemMaxUseno journald e configure ILM no Elasticsearch. - Lentidão no Elasticsearch: monitore heap usage com
GET _nodes/stats/jvme aumente os shards se necessário.
Referências
- Documentação oficial do systemd-journald — Referência completa dos comandos e opções do journalctl.
- Guia de configuração do logrotate — Manual detalhado com todas as diretivas e exemplos de configuração.
- Documentação oficial do Elastic Stack — Tutoriais e referências sobre Elasticsearch, Logstash, Kibana e Filebeat.
- Tutorial de integração journald com ELK — Artigo prático sobre coleta de logs do systemd com o Elastic Stack.
- Guia de segurança para o Elastic Stack — Configuração de TLS, autenticação e controle de acesso.