La combinaison d’ElasticSearch, Logstash et Kibana, plus connue sous l’acronyme ELK, permet de collecter, visualiser et analyser des logs générés par toutes sortes d’applications.

  • ElasticSearch est un moteur d’indexation reposant une base de données NoSQL interrogable via une API REST
  • Logstash est un outil pour collecter et découper des logs afin d’y extraire des informations pertinentes telles que des indicateurs techniques ou métier pour les stocker dans un outil tiers (ici ElasticSearch)
  • Kibana permet d’interroger ElasticSearch et de construire des tableaux de bord

Cette solution semble donc adaptée pour monitorer les logs Apache.

Format des logs

Le format des logs à collecter correspond au Combined Apache Log auquel a été ajouté deux informations sur le temps de traitement des requêtes en seconde et en microseconde. Voici la configuration des logs Apache :

LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%T/%D**" combined

Pour analyser ces logs, il est nécessaire d’utiliser le plugin grok qui contient déjà la configuration pour découper des logs Apache.

Configuration de Logstash

La configuration de Logstash a besoin de 3 éléments : la source de données, le filtre à appliquer et la destination des données. Pour cela, il faut créer le fichier ./logstash/logstash-apache.conf :

input {
  file {
    type => "apache_access"
    path => "/logs/*access.log"
    start_position => beginning
  }
}

filter {
  if [type] == "apache_access" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}( \*\*%{NUMBER:responsetimesec}/%{POSINT:responsetimemic}\*\*)?" }
    }
    date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  }
  if [clientip]  {
    geoip {
      source => "clientip"
      target => "geoip"
      add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
      add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
    }
    mutate {
      convert => [ "[geoip][coordinates]", "float" ]
      convert => [ "responsetime", "integer" ]
      convert => [ "responsetimesec", "integer" ]
      convert => [ "responsetimemic", "integer" ]
      convert => [ "bytes", "integer" ]
    }
  }
}

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

Logstash va lire les fichiers de log dans /logs, les découper avec grok et les envoyer dans des index quotidiens sur elasticsearch.

Utilisation de Docker Compose

Avec Docker Compose, il est possible de démarrer un ELK très simplement en créant un fichier ./docker-compose.yml :

elasticsearch:
  image: elasticsearch

logstash:
  image: logstash
  volumes:
   - ./logstash/logstash-apache.conf:/opt/logstash/logstash.conf
   - ./logs:/logs
  links:
   - elasticsearch
  command: logstash -f /opt/logstash/logstash.conf

kibana:
  image: kibana
  links:
   - elasticsearch
  ports:
   - "5601:5601"

Les fichiers de logs d’Apache doivent être déposés dans le répertoire ./logs.

Pour télécharger, installer et démarrer ELK, il suffit d’exécuter la commande suivante :

$ docker-compose up -d

Creating elk-elasticsearch
Creating elk-logstash
Creating elk-kibana

Pour visualiser les logs d’Apache dans Kibana, il faut :

  • Se rendre à l’adresse http://localhost:5601
  • Configurer l’index apache_logstash-* sur la page Settings->Indices
  • Puis aller sur la page discover

Il ne reste plus qu’à créer le tableau de bord pour monitorer Apache avec les indicateurs souhaités !