Gerenciamento de logs centralizado com ELK Stack e Grafana Loki

1. Fundamentos da Centralização de Logs

O gerenciamento descentralizado de logs apresenta problemas críticos para equipes de infraestrutura e desenvolvimento. A fragmentação dos registros em múltiplos servidores dificulta a correlação de eventos entre sistemas, reduz a visibilidade operacional e torna o troubleshooting um processo lento e manual. Sem uma visão unificada, identificar a causa raiz de uma falha que atravessa camadas de aplicação, banco de dados e rede pode levar horas ou até dias.

A centralização de logs resolve esses problemas ao consolidar todos os registros em um único repositório pesquisável. Os benefícios incluem busca unificada em tempo real, análise histórica para detecção de padrões, correlação entre eventos de diferentes fontes e troubleshooting ágil com dashboards interativos. A arquitetura geral de um sistema centralizado segue quatro etapas principais: coleta (agentes nos servidores), armazenamento (banco de dados otimizado), indexação (estruturação para consultas rápidas) e visualização (interfaces gráficas para exploração).

2. ELK Stack: Componentes e Arquitetura

A ELK Stack é composta por três componentes principais. O Elasticsearch fornece armazenamento e indexação distribuída, baseado no Apache Lucene, permitindo buscas full-text em grandes volumes de dados com baixa latência. O Logstash atua como pipeline de ingestão, realizando parsing, transformação e enriquecimento dos logs antes do armazenamento. O Kibana oferece visualização, dashboards e ferramentas de descoberta para explorar os dados indexados.

O fluxo de dados típico segue: agentes (Filebeat, Metricbeat) enviam logs para o Logstash, que aplica filtros como grok para extrair campos estruturados. Em seguida, os dados são enviados ao Elasticsearch, onde são indexados e ficam disponíveis para consulta no Kibana. Esta arquitetura suporta alta disponibilidade e escalabilidade horizontal.

3. Configuração Prática do ELK Stack

Para iniciar uma instalação single-node do Elasticsearch, edite o arquivo elasticsearch.yml:

cluster.name: logs-cluster
node.name: node-1
path.data: /var/lib/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node

Configure o Logstash com um pipeline para logs de aplicação:

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
  }
  date {
    match => ["timestamp", "ISO8601"]
  }
  mutate {
    remove_field => ["@version", "host"]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}

No Kibana, crie um dashboard com visualizações para monitoramento em tempo real: gráfico de barras por nível de log, linha do tempo de erros e tabela de mensagens recentes. Use o campo @timestamp para definir intervalos de atualização automática.

4. Grafana Loki: Princípios e Diferenciais

O Grafana Loki adota uma abordagem diferente: armazenamento baseado em índices invertidos com labels, similar ao Prometheus. Em vez de indexar o conteúdo completo dos logs, o Loki indexa apenas metadados (labels) e armazena os logs em blocos compactados. Isso reduz drasticamente o consumo de armazenamento e acelera a ingestão.

As principais diferenças entre Loki e Elasticsearch incluem: custo operacional menor (Loki não requer indexação pesada), desempenho superior em consultas por labels e escalabilidade linear com armazenamento de objetos (S3, GCS). No entanto, Loki não suporta busca full-text avançada como o Elasticsearch. A arquitetura do Loki inclui distribuidores (recebem logs e distribuem para ingesters), ingesters (agregam dados em memória), queriers (executam consultas) e armazenamento de objetos para retenção de longo prazo.

Loki é ideal para ambientes com alto volume de logs e baixa cardinalidade, como logs de infraestrutura (syslog, journald, Docker). Para logs de aplicação que exigem parsing complexo, o Elasticsearch ainda é mais adequado.

5. Integração do Grafana Loki com Promtail e Grafana

O Promtail é o agente oficial de coleta para Loki. Configure-o para capturar logs de arquivos:

scrape_configs:
  - job_name: system
    static_configs:
      - targets: [localhost]
        labels:
          job: varlogs
          __path__: /var/log/*.log

Para logs do Docker, use:

scrape_configs:
  - job_name: docker
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
    relabel_configs:
      - source_labels: [__meta_docker_container_name]
        target_label: container

Conecte o Grafana ao Loki adicionando uma fonte de dados do tipo Loki com URL http://localhost:3100. Exemplo de query LogQL para filtrar logs de erro:

{job="varlogs"} |= "error" | logfmt | __error__ = ""

Para agregar por container:

sum by (container) (count_over_time({job="docker"} |= "ERROR" [5m]))

6. Comparação Técnica: ELK Stack vs Grafana Loki

Característica ELK Stack Grafana Loki
Busca full-text Sim, com scoring de relevância Limitado a filtros |=, !=, |~
Indexação Completa (alto custo) Apenas labels (baixo custo)
Armazenamento Disco local ou remoto S3/GCS/Azure Blob
Escalabilidade Complexa (shards, replicas) Simples (distribuidores + ingesters)
Casos de uso Logs estruturados, auditoria Logs de infraestrutura, contêineres

Para logs de aplicação com parsing complexo, o ELK Stack é superior. Para logs de sistema e Docker em alta escala, o Loki oferece melhor custo-benefício. Em cenários híbridos, ambas as stacks podem coexistir: Loki para logs de infraestrutura e ELK para logs de negócio.

7. Boas Práticas e Manutenção do Sistema Centralizado

Para gerenciar retenção no Elasticsearch, configure ILM (Index Lifecycle Management):

PUT _ilm/policy/logs_policy
{
  "policy": {
    "phases": {
      "hot": { "min_age": "0ms", "actions": { "rollover": { "max_size": "50GB" } } },
      "delete": { "min_age": "30d", "actions": { "delete": {} } }
    }
  }
}

No Loki, defina TTL no arquivo de configuração:

table_manager:
  retention_deletes_enabled: true
  retention_period: 720h

Monitore a saúde da stack com alertas para falhas de ingestão (logs ausentes por mais de 5 minutos) e consultas lentas (tempo de resposta acima de 10 segundos). Use autenticação via nginx reverse proxy com SSL e controle de acesso baseado em roles (RBAC no Elasticsearch, multitenancy no Loki). Realize backups regulares dos índices do Elasticsearch usando snapshots para S3 e exporte periodicamente dados históricos do Loki para cold storage.

Referências