Configuração Avançada da Pilha ELK para Monitoramento de Logs

Instalação e configuração do Elasticsearch 6

Para instalar o Elasticsearch, siga as diretrizes oficiais. Altere o arquivo de configuração elasticsearch.yml definindo network.host: 0.0.0.0 para permitir acesso externo. Verifique a instalação acessando http://endereco-do-servidor:9200.

Configuração do plugin Head para gerenciamento de clusters

O plugin Head fornece uma interface web para explorar e gerenciar clusters do Elasticsearch. Instale as dependências necessárias: Node.js, npm e Git. Clone o repositório do plugin Head e instale suas dependências com npm. Modifique o arquivo Gruntfile.js para permitir acesso de qualquer IP adicionando hostname: '*' nas opções do servidor. Atualize o endereço de conexão no arquivo app.js para apontar para o servidor Elasticsearch. No Elasticsearch, ative o acesso cross-origin adicionnado ao elasticsearch.yml:

http.cors.enabled: true
http.cors.allow-origin: "*"

Abra a porta 9100 no firewall e inicie o plugin com node_modules/grunt/bin/grunt server. Acesse a interface via http://endereco-do-servidor:9100.

Instalação do Kibana para visualização de dados

Baixe a versão correspondente do Kibana, extraia o pacoto e mova para um diretório como /usr/local/kibana. Edite o arquivo de configuração kibana.yml, definindo server.host e elasticsearch.url com o IP do servidor. Abra a porta padrão 5601 no firewall e inicie o Kibana com /usr/local/kibana/bin/kibana. Acesse via http://endereco-do-servidor:5601.

Coleta de logs do Nginx com Filebeat

Configure o Filebeat para coletar logs de acesso do Nginx. Exemplo básico de configuração no arquivo filebeat.yml:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
output.elasticsearch:
  hosts: ["endereco-elasticsearch:9200"]

Para análise estruturada, converta os logs do Nginx para formato JSON. Modifique a configuração do log no Nginx:

log_format json_logs '{"timestamp":"$time_iso8601",'
                     '"host":"$server_addr",'
                     '"client_ip":"$remote_addr",'
                     '"request_size":$body_bytes_sent,'
                     '"response_time":$request_time,'
                     '"status":"$status"}';

No Filebeat, ative a aálise JSON:

filebeat.inputs:
- type: log
  enabled: true
  json.keys_under_root: true
  json.overwrite_keys: true
  paths:
    - /var/log/nginx/access.log

Personalize os nomes dos índices no Elasticsearch e ajuste os templates para refletir a estrutura dos dados.

Coleta de logs de múltiplas fontes

Para coletar logs de acesso e erro do Nginx separadamente, use tags no Filebeat e direcione para índices distintos:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  tags: ["nginx_access"]
- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["nginx_error"]
output.elasticsearch:
  hosts: ["endereco-elasticsearch:9200"]
  indices:
    - index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "nginx_access"
    - index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "nginx_error"

Para logs do Tomcat, formate-os em JSON e configure o Filebeat similarmente, usando tags como ["tomcat_access"].

Tratamento de logs de múltiplas linhas

Logs de aplicações Java muitas vezes são multilinha. Use configurações de padrão no Filebeat para agrupar linhas:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/application.log
  multiline.pattern: '^\d{4}-\d{2}-\d{2}'
  multiline.negate: true
  multiline.match: after

Isso combinará linhas que não iniciam com uma data como parte do evento anterior.

Coleta de logs de contêineres Docker

Para coletar logs de contêineres Docker, configure o Filebeat para ler os arquivos de log JSON do Docker. Use labels nos contêineres via Docker Compose para distinção:

version: '3'
services:
  app_web:
    image: nginx
    labels:
      log_service: web
    logging:
      options:
        labels: "log_service"

No Filebeat, leia os logs do Docker e use os labels para indexação:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - "/var/lib/docker/containers/*/*-json.log"
  json.keys_under_root: true
  json.overwrite_keys: true
output.elasticsearch:
  hosts: ["endereco-elasticsearch:9200"]
  indices:
    - index: "docker-web-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        attrs.log_service: "web"

Uso de Redis como cache para logs

Para arquiteturas maiores, use o Redis como buffer entre o Filebeat e o Logstash. Configure o Filebeat para enviar logs ao Redis:

output.redis:
  hosts: ["endereco-redis:6379"]
  key: "filebeat_logs"
  db: 0

No Logstash, leia os logs do Redis e processe-os:

input {
  redis {
    host => "endereco-redis"
    key  => "filebeat_logs"
    data_type => "list"
  }
}
filter {
  mutate {
    convert => { "response_time" => "float" }
  }
}
output {
  elasticsearch {
    hosts => ["endereco-elasticsearch:9200"]
    index => "processed-logs-%{+yyyy.MM.dd}"
  }
}

Use condicionais no Logstash para direcionar logs a índices diferentes com base em campos.

Utilização de módulos nativos do Filebeat

O Filebeat oferece módulos para fontes comuns como Nginx. Ative o módulo com ./filebeat modules enable nginx. Configure os caminhos dos logs no arquivo modules.d/nginx.yml:

- module: nginx
  access:
    enabled: true
    var.paths: ["/var/log/nginx/access.log"]
  error:
    enabled: true
    var.paths: ["/var/log/nginx/error.log"]

Isso automatiza a análise e indexação, mas oferece menos flexibilidade do que configurações personalizadas.

Coleta de logs do sistema Linux

Configure o Filebeat para coletar logs do sistema:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/syslog
    - /var/log/auth.log
  tags: ["system"]

Exclua arquivos compactados e defina um período de ignorar logs antigos com ignore_older.

Tags: Elasticsearch 6 Logstash Kibana filebeat Nginx logs

Publicado em 6-30 01:21