Ceci est une ancienne révision du document !
Logstash est un puissant outil de gestion de logs permettant d'effectuer une mise en forme avancée de ceux-ci. En effet, étant donné la diversité des formats, il peut rapidement devenir difficile de chercher une information précise apparaissant sous différentes formes, dans différents services. Logstash permet de pallier à ce problème en définissant un tamis dans lequel sont filtrés les messages : il est alors possible de classifier l'information par la définition de champs. La sortie formatée est ensuite envoyée au cluster Elasticsearch afin d'être indexée.
Nous utilisons actuellement la version 2.0 de Logstash.
Pour chaque machine un serveur syslog (rsyslog ou syslog-ng) surveille les fichiers journaux. Chaque nouveau message est ainsi transféré vers le serveur Logstash (192.168.102.9), où il est analysé et formaté avant d'être transmis au cluster Elasticsearch.
Pour transmettre les journaux vers Logstash, il est nécessaire de créer sur la machine concernée le fichier /etc/rsyslog.d/forward.conf.
Par défaut rsyslog surveille déjà tous les messages système (cron, authentification, noyau, …).
Pour rajouter un fichier supplémentaire, il est nécessaire d'utiliser le module imfile de rsyslog :
$ModLoad imfile
Puis pour chaque fichier à surveiller :
$InputFileName /var/log/service.log $InputFileTag mon-service: $InputFileStateFile stat-mon-service $InputFileSeverity info $InputRunFileMonitor
Le champ Tag doit contenir par défaut le nom du service d'où est issu le journal, mais il est possible de rajouter des règles supplémentaires dans Logstash.
Par exemple, pour un serveur web Apache :
$InputFileTag apache-mon-site-error:
créera un champ “program” contenant “apache”, un champ “vhost” contenant “mon-site” et un champ “apache_logtype” contenant “error”.
A noter que les deux points “:” finaux sont indispensables pour respecter le format syslog, et que l'entrée StateFile? doit être unique.
Puis pour tout envoyer vers le container Logstash sur le port 5140 en TCP :
*.* @logstash:5140
On utilisait avant le port standard 514 mais le service logstash drop maintenant les privilèges et ne peut donc plus s'y binder.
Le fichier de configuration de Logstash est situé sur le container logstash (192.168.102.9) à l'emplacement /opt/logstash/logstash.conf.
Il est composé de trois sections :
input
définit les entrées. Ici on écoute sur le port 5140 en TCP et en UDP : tcp { type => syslog port => 5140 } udp { type => syslog port => 5140 }
filter
permet de définir une chaîne de filtres à appliquer sur les données. Un des plugins de filtrage les plus utilisés est Grok : à partir d'une expression régulière, il capture des informations et les ajoute dans des champs. Certaines expressions régulières sont déjà définies dans l'installation de base Logstash, par exemple pour récupérer les données au format syslog : grok { match => [ "message", "<%{POSINT:priority}>%{SYSLOGBASE} %{GREEDYDATA:shortmessage}" ] }
Une liste des expressions pré-définies et de leur valeur est disponible sur le dépôt Git de Logstash.
Ensuite, on écrit les bons patterns pour matcher les logs radius, DHCP, etc.
output
définit les sorties. Ici on envoie les données à l'un des noeuds (peu importe lequel) de notre cluster Elasticsearch : output { elasticsearch { hosts => ['192.168.102.229:9200'] template_overwrite => true } }
Comme pour les autres composants de la stack ELK, n'hésitez pas à consulter la très bonne documentation officielle.