Béjean Développement

Installer et configurer Logstash pour faciliter le traitement des logs Magento 2

Objectif

Installer Logstash 7.6 pour transmettre les logs Magento 2 à un serveur ELK

Installation

Composants indispensables

Pour fonctionner Logstash a besoin de Java. Je vous invite à suivre les étapes ci-dessous pour lancer l'installation :

apt install default-jre

Vérifier l'installation en lançant la commande : java --version, le résultat doit être :

openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-post-Debian-1deb10u2)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-post-Debian-1deb10u2, mixed mode, sharing)

Puis, installer le JDK :

apt install default-jdk

Vérifier en lançant la commande : javac --version, le résultat doit être :

javac 11.0.9.1

Installation de Logstash

apt-get install gnupg2 apt-transport-https
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update && apt-get install logstash=1:7.6.2-1

J'ai précisé la version de Logstash à installer car le serveur Elasticsearch est en version 7.6.2.

Vérifier si Logstash est actif en lançant cette commande : systemctl status logstash.

Si besoin, il faut activer et lancer le service Logstash :

systemctl enable logstash && systemctl start logstash

Configuration

Modifions le fichier de configuration de Logstash pour éviter les erreurs au démarrage du service :

nano /etc/logstash/logstash.yml

Vous trouverez, ci-dessous, les modifications que j'ai apportées au fichier de configuration :

xpack.monitoring.enabled: false
xpack.monitoring.elasticsearch.hosts: [ "http://url-elasticsearch:9200" ]
xpack.management.enabled: false

Avant d'enregistrer et de fermer le fichier, n'oubliez pas de modifier url-elasticsearch vers l'URL de votre serveur Elasticsearch.

Si vous souhaitez plus d'informations sur la configuration, je vous invite à consulter la documentation, lien vers la documentation.

Relancer le service : systemctl restart logstash.

Configuration de Logstash

Magento 2 génère ses logs dans son dossier var/log. Si vous avez suivi le tutoriel d'installer de Magento sous Debian 10, les fichiers se trouvent dans ce dossier /var/www/html/magento/var/log, lien vers le tutoriel.

Nous allons donc configurer Logstash pour qu'il consulte en permanence ce dossier.

Fichier de traitement des logs

Concentrons-nous maintenant sur le fichier de configuration pour le traitement des logs Magento 2.

Le fichier ci-dessous est composé de 3 parties :

  • input
  • filter
  • output

Vous retrouverez quelques explications sur chaque paramètre utilisé à la fin du tutoriel.

Le contenu ci-dessous doit être inséré dans un fichier nommé magento.conf dans le dossier /etc/logstash/conf.d.

input {
  file {
    type => "magento-log"
    path => "/var/www/html/magento/var/log/*.log"
    exclude => ["*.gz"]
    codec => multiline {
      pattern => "^\[%{TIMESTAMP_ISO8601}\]"
      negate => true
      what => "previous"
    }
  }
}

filter {
  if [type] == "magento-log" {

    grok {
      match => {
        "message"  => "\[%{TIMESTAMP_ISO8601:date}\] %{WORD:word}.%{WORD:level}: %{GREEDYDATA:content} \[\]"
      }
    }

    date {
      match => ["date", "yyyy-MM-dd HH:mm:ss"]
      timezone => "Europe/Paris"
    }

    mutate {
      copy => { "[@timestamp]" => "date" }
      add_tag => [ "%{level}" ]
    }

    if "_grokparsefailure" in [tags] {
      mutate {
        remove_field => [ "message" ]
      }
    }
  }
}

output {
  if [type] == "magento-log" {
    elasticsearch {
      hosts => ["url-elasticsearch:9200"]
      index => "magento2-%{+YYYY.MM.dd}"
    }

    if "_grokparsefailure" in [tags] {
      elasticsearch {
        hosts => ["url-elasticsearch:9200"]
        index => "magento2-grokparsefailure-%{+YYYY.MM.dd}"
      }
    }
  }
}

Avant d'enregistrer et de fermer le fichier, n'oubliez pas de modifier url-elasticsearch vers l'URL de votre serveur Elasticsearch.

Une fois le fichier enregistré, il faut relancer le service Logstash :

systemctl restart logstash

Résultat

Pour contrôler que les données remontent correctement, je vous invite à utiliser Kibana.

Avant de visualiser les logs, il faut créer un Index pattern pour vous permettre de visualiser les logs dans l'onglet Discover.

Les paramètres utilisés

Bloc : Input

Pour traiter les fichiers, nous utilisons le plugin file de Logstash, lien vers la documentation.

Voici un résumé des propriétés que j'ai utilisées pour la partie :

  • type : Ce paramètre sera présent dans Elasticsearch et nous servira pour poser quelques conditions dans le fichier de configuration.
  • path : Indique à Logstash le ou les fichiers à traiter
  • exclude : Exclude est un tableau qui permet d'exclure le traitement de certains fichiers, dans mon cas, je refuse de traiter les fichiers *.gz
  • codec : Permet de traiter plusieurs lignes de logs en se basant sur un pattern, lien vers la documentation

Bloc : Filter

Le bloc filter permet de traiter le contenu de chaque fichier. J'ai ajouté la condition if [type] == "magento-log" {} pour sécuriser le traitement des logs par Logstash. On peut également personnaliser le traitement des logs.

Le découpage des lignes de chaque fichier est traité par le plugin grok, lien vers la documentation. C'est un plugin assez puissant basé sur les expressions régulières. Dans le cas où grok ne parviendrait pas à parser les logs, il ajoute le tag _grokparsefailure.

Le plugin date permet de faire correspondre le format de date du fichier pour un traitement. Dans notre cas, je fais correspondre la date des fichiers de log Magento 2 pour le copier dans le champ [@timestamp]. Ceci est très important car lors de l'analyse des logs, il n'y aura pas d'erreur de date et d'heure, lien vers la documentation. J'en profite également pour renseigner le fuseau horaire.

Le plugin mutate me sert pour remplacer le contenu du champ date dans le champ [@timestamp] et aussi pour ajouter le tag level qui correspond au niveau de gravité du log, lien vers la documentation.

Nous finissons par la condition if "_grokparsefailure" in [tags] {} qui va supprimer le champ message lorsque le plugin grok n'aura pas rencontré d'erreur. Ceci permet également de réduire le volume de données stockés par le serveur Elasticsearch.

Bloc : Output

Comme pour le bloc filter, j'ai ajouté une condition autour des 2 paramètres dans le but de sécuriser l'envoi des données sur le serveur Elasticsearch. Il existe plusieurs plugins de sortie pour Logstash, voir la liste. Dans mon cas, j'ai utilisé le plugin Elasticsearch, lien vers la documentation.

Très simplement, nous envoyons les données au serveur Elasticsearch de notre choix en précisant le nom de l'index magento2-%{+YYYY.MM.dd}. L'index est horodaté pour éviter un poids important.

Nous utilisons à nouveau la condition if "_grokparsefailure" in [tags] {} pour également envoyer, dans un autre index, les erreurs rencontrées par grok lors du traitement des journaux.