Pipeline de centralisation des logs : Filebeat, Redis et Logstash vers Elasticsearch

Ce guide illustre la mise en place d’une chaîne de collecet et de traitement de logs applicatifs. Filebeat assure la capture des fichiers, Redis joue le rôle de tampon distribué, Logstash parse et enrichit les événements, et Elasticsearch indexe les données pour la recherche.

Configuration de Filebeat

# Entrées de collecte
filebeat.inputs:
- type: log
  paths:
    - /var/log/application/service-a/*.log
  encoding: utf-8
  document_type: app_service_a
  multiline.pattern: '^\d{4}-\d{2}-\d{2}'
  multiline.negate: true
  multiline.match: after

filebeat.registry_file: ${path.data}/registry-app

# Sortie vers Redis avec équilibrage de charge
output.redis:
  hosts: ["redis1.exemple.com:6379", "redis2.exemple.com:6379", "redis3.exemple.com:6379"]
  key: canal-logs
  datatype: list
  loadbalance: true

Configuration d'Elasticsearch

cluster.name: cluster-production
node.name: es-node-b
bootstrap.memory_lock: true
network.host: 10.0.1.12
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["10.0.1.11", "10.0.1.12", "10.0.1.13"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

Configuraton de Logstash

input {
  redis {
    data_type => "list"
    key => "canal-logs"
    host => "redis1.exemple.com"
    port => 6379
  }
  redis {
    data_type => "list"
    key => "canal-logs"
    host => "redis2.exemple.com"
    port => 6379
  }
  redis {
    data_type => "list"
    key => "canal-logs"
    host => "redis3.exemple.com"
    port => 6379
  }
}

filter {
  if [type] == "app_service_a" {
    grok {
      match => {
        "message" => "%{TIMESTAMP_ISO8601:horodatage}\s+\[%{DATA:thread}\]\s+%{DATA:niveau}\s+%{DATA:classe}\s+-\s+\[%{DATA:id_metier}\]%{DATA:source},%{DATA:cible},%{DATA:api},%{DATA:succes},%{DATA:duree},%{GREEDYDATA:erreur}"
      }
    }
    mutate {
      convert => { "duree" => "integer" }
    }
  } else if [type] == "app_service_b" {
    grok {
      match => {
        "message" => "%{TIMESTAMP_ISO8601:horodatage}\s+\[%{DATA:thread}\]\s+%{DATA:niveau}\s+%{DATA:classe}\s+"
      }
    }
  } else {
    grok {
      match => {
        "message" => "%{TIMESTAMP_ISO8601:horodatage}\s+%{DATA:thread}\s+%{DATA:niveau}\s+%{DATA:classe}\s+"
      }
    }
  }
  date {
    match => ["horodatage", "ISO8601"]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["es1.exemple.com:9200", "es2.exemple.com:9200", "es3.exemple.com:9200"]
    index => "%{type}-%{+YYYY.MM.dd}"
    template_name => "modele_logstash"
    pool_max_per_route => 300
    flush_size => 2000
    idle_flush_time => 5
  }
}

Étiquettes: filebeat Redis Logstash Elasticsearch grok

Publié le 5 août à 16h21