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 à traiterexclude
: Exclude est un tableau qui permet d'exclure le traitement de certains fichiers, dans mon cas, je refuse de traiter les fichiers *.gzcodec
: 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.