Monitorer ses logs avec Redis & ELK

Vous avez sûrement entendu parler de E.L.K (Elasticsearch, Logstash, Kibana) ? C’est une solution complète de monitoring de logs, qui commence à faire parler de lui et qui permet de faire des choses très sympa.

C’est un stack très puissant et complet, mais lorsqu’on a beaucoup de logs à envoyer dans Elasticsearch, il peut arriver que Logstash s’embrouille un peu les pinceaux. C’est pour cela qu’il peut être intéressant d’ajouter REDIS à notre stack de monitoring.

REDIS, pour résumer, c’est une Base NOSQL qui vient se placer entre nos logs et Logstash et qui permet de faire un « entonnoir » à logs. Cela permet d’envoyer beaucoup plus de logs et permet à Logstash de filtrer et enregistrer correctement les logs dans Elasticsearch.

Voici un petit schéma pour résumer (il n’est pas de moi) :

Les shippers dans notre cas seront Beaver (en Python),

le Broker, c’est REDIS, l’entonnoir à log),

l’Indexer, Logstash qui découpe et range les logs,

le Storage, Elasticsearch qui stocke et permet la recherche rapide des données,

l’inteface Web, Kibana qui permet de rechercher ses logs et de faire des Dashboards.

Voici les points que nous aborderons dans ce tutoriel :

L’installation de ElasticSearch L’installation de Logstash L’installation de Kibana L’installation de REDIS L’installation de Beaver (log shipper) La mise en relation du tout le stack Conclusion

L’installation se fait sur un serveur Ubuntu 14.04, toute les commandes sont lancer en Root. Si vous utilisez une autre distribution, il faudra adapter dans certain cas.

Il est suggéré de séparer le service REDIS du stack ELK (sur deux serveurs distinct), cela permet de séparer les tâches et d’améliorer les performances.

Nous allons donc installer Elasticsearch, Logstash et Kibana sur un premier serveur puis REDIS sur un second. Finalement, nous pourrons recevoir avec ces deux serveurs, les logs de dizaines (voir de centaines) d’autres serveurs. (selon les performances)

I – Installation d’Elasticsearch

Elasticsearch est un moteur de recherche libre open source utilisant Lucene (un des projets de l’Apache Software Foundation).

Il est distribué (architecture de type cloud computing).

Il utilise Lucene pour le stockage de ses données dans un format NoSQL .

. Il utilise la méthode REST

Elasticsearch et Logstash fonctionnent en JAVA, pour les faire fonctionner il faudra tout d’abord l’installer :

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 apt-get update apt-get install oracle-java8-installer

On peut maintenant récupérer la dernière version d’ElasticSearch sur leur site officiel,

wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.deb dpkg -i elasticsearch-1.7.1.deb

L’avantage d’installer le paquet DEB d’Elasticsearch, c’est qu’il déploie automatiquement un script init, et le lancement du service au démarrage de serveur.

On va (re)lancer le service Elasticsearch :

service elasticsearch restart

et vérifier qu’Elasticsearch est bien lancé :

curl http://localhost:9200

La commande cURL devrait vous renvoyer quelques lignes de Json avec un « status » : 200.

Si ce n’est pas le cas, vérifiez le lancement d’Elasticsearch, ou téléchargez sa version .tar.gz.

II – Installation de Logstash

Logstash est un ETL (Extract Transform Load) destiné principalement au traitement des logs, qui compte plus de 160 plugins. Sa devise est « Collect, Enrich & Transport Data »

Dans notre cas, nous allons l’utiliser pour récupérer les logs dans REDIS, les traiter (découpe, traitement …) puis les stocker dans Elasticsearch.

Maintenant que notre base Elasticsearch est installé et fonctionnelle, on va pouvoir installer Logstash.

On va donc commencer par créer les dossiers nécessaires à Logstash :

mkdir /etc/logstash /opt/logstash

Comme Logstash fonctionne en JAVA, il faut qu’il soit installé (cf: Installation d’Elasticsearch).

On va désormais récupérer la dernière version de Logstash sur le site officiel :

wget https://download.elastic.co/logstash/logstash/packages/debian/logstash_1.5.3-1_all.deb dpkg -i logstash_1.5.3-1_all.deb

On peut ensuite créer le fichier de configuration /etc/logstash/conf.d/logstash.conf :

input { redis { host => "votre-serveur-REDIS" type => "redis-input" data_type => "list" key => "logstash" } } filter { grok { type => "syslog" match => [ "message", "%{SYSLOGBASE2}" ] add_tag => [ "syslog", "grokked" ] } } output { elasticsearch { host => "127.0.0.1" } }

On va attendre avant de démarrer Logstash, car il va vouloir se connecter à REDIS.

III – Installation de Kibana

Kibana est un visualiseur de données en Javascript (AngularJS), directement relié à Elasticsearch. Il permet de créer des recherches personnalisés, qui mène à la création de graphs qui mènent à la mis en place de Dashboards.

Kibana intègre directement son serveur http sur un port élevé (configurable).

Il peut être bien de mettre en place un reverse-proxy (Apache ou Nginx) en front de Kibana, cependant on peut très bien atteindre directement Kibana sur le port 5601 (par défaut).

On va récupérer Kibana directement sur le site officiel :

wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz tar zxvf kibana-4.1.1-linux-x64.tar.gz mv kibana-4.1.1 kibana ; cd kibana/

Kibana n’existe pas sous la forme de paquet *.deb, il faut exécuter un binaire qui le lancera. On va tout d’abord éditer le fichier de configuration config/kibana.yml :

port: 5601 host: "0.0.0.0" elasticsearch_url: "http://127.0.0.1:9200"

On va mettre en place un script d’init pour éviter de lancer le binaire de Kibana manuellement, pour cela il faut récupérer le script et le mettre dans /etc/init.d/ :

git clone https://github.com/akabdog/scripts.git scripts mv scripts/kibana4_init /etc/init.d/kibana4 chmod +x /etc/init.d/kibana4

On va modifier quelques points de ce script init :

KIBANA_BIN=/opt/kibana-4.1.1/bin USER=root

On va pouvoir lancer Kibana :

service kibana4 start service kibana4 status

La dernière commande devrait vous renvoyer « * kibana is running« .

IV – Installation de REDIS

Nous allons maintenant mettre en place REDIS.

Comme je vous l’ai expliqué plus haut, il est conseillé d’utiliser REDIS sur un serveur à part, pour séparer les services et permettre de meilleures performances.

Redis-server peut facilement être installé sur un serveur Ubuntu de cette manière :

add-apt-repository ppa:chris-lea/redis-server apt-get update apt-get install redis-server

On peut ensuite modifier quelques paramètres dans le fichier /etc/redis/redis.conf :

tcp-keepalive 60 #bind 127.0.0.1

On redémarre REDIS et vérifie qu’il tourne bien :

service redis-server restart service redis-server status

Si la commande « status » vous retourne que le service tourne, on peut continuer.

V – Installation de Beaver

Beaver est une application en Python (dispo sous Github).

Elle s’installe sur les serveurs sur lesquels on souhaite récupérer les logs, et elle se chargera de les envoyer dans REDIS (dans notre cas).

Beaver s’installe facilement grâce à Python-pip, pour l’installer voici la démarche :

apt-get -y install python-pip pip install beaver

L’utilitaire PiP devrait donc réaliser l’installation.

On va configurer Beaver et le mettre en tant que service (pour le gérer plus facilement). On va commencer par créer le fichier /etc/beaver/beaver.conf :

[beaver] transport: redis redis_url: redis:// <REDIS-IP:PORT> redis_namespace: logstash logstash_version: 1 [/var/log/auth.log] tags: auth type: syslog [/var/log/syslog] tags: syslog type: syslog [/var/log/apache2/access.log] tags: access type: httpd

Le fichier de configuration se veut relativement simple, dans la première partie on configure la destination vers laquelle les logs seront envoyés (REDIS), puis on configure les logs à « shipper« .

On peut également leurs donnés des tags et des types pour qu’ils soient triés (on verra cela plus loin dans le tutoriel).

Beaver est installé et configuré, on va le mettre en place en tant que service grâce au fichier /etc/init.d/beaver :

git clone https://github.com/valentin2105/LinuxConfs.git cp LinuxConfs/init.d/beaver /etc/init.d/beaver service beaver start service beaver status

Si la commande « status » ne rapporte pas d’erreurs, Beaver est bien lancé !

VI – La mise en relation du stack

Maintenant que nous avons tout installé, nous allons pouvoir vérifier que tout fonctionne et configurer à minima Kibana pour pouvoir interroger nos logs.

Vu que notre serveur REDIS est fonctionnel, que Beaver lui envoie les logs et qu’Elasticsearch est prêt à stocker ses données, il faut démarrer logstash :

service logstash start

On peut vérifier que Logstash s’est bien connecté à REDIS dans /var/log/logstash/logstash.log (s’il ne spam pas d’erreur de connexion à REDIS, tout est bon).

On va pouvoir se rendre sur l’interface Web de Kibana.

Ouvrez votre navigateur à l’URL http://<ip-serveur-elk>:5601/

Si aucune erreur ne s’affiche, la connexion avec Elasticsearch est correct (ils communiquent directement). Il va falloir créer l’index name qui permettra de trier vos données :

L’index name est logstash-* (par défaut, cela correspond à tous les enregistrements fait par Logstash). Le time-field name est @timestamp et permet de trier par heure/date (ce qu’on veut).

Si tout s’est bien passé, vous devriez voir vos premiers logs comme ceci :

On a parlé précédemment des types et tags dans Beaver, on peut constater qu’on les retrouve dans nos logs et qu’on peut les trier par exemple par type :

Le type « syslog » représente 67% de mes logs

Kibana s’organise en 4 partie :

Discover – Les logs sont affichés ici de manière « brut », une barre de recherche permet de faire des tries. Les recherches personnalisées se créer dans cette partie.

– Les logs sont affichés ici de manière « brut », une barre de recherche permet de faire des tries. Les recherches personnalisées se créer dans cette partie. Visualize – Partie de création de graphique, se basant sur les recherches créées dans la partie Discover.

– Partie de création de graphique, se basant sur les recherches créées dans la partie Discover. Dashboard – Partie d’affichage de recherches et de graphiques sur un ou plusieurs dashboards personnalisables.

– Partie d’affichage de recherches et de graphiques sur un ou plusieurs dashboards personnalisables. Settings – Partie de modification des paramètres de Kibana.

Maintenant, c’est à vous de jouer,

de créer vos recherches personnalisées (exemple : Access Logs Apache d’accès à www.monsite.com),

de créer vos graphiques (exemple : Camembert des sites les plus visités à travers un proxy Squid)

et de créer vos dashboards centralisant ses données, par exemple :



Pour allez plus loin avec Kibana, je vous conseille de suivre la documentation.

VII – Conclusion

J’ai découvert en premier le stack ELK seul (sans REDIS), après l’avoir utilisé un moment avec Logstash-Forwarder comme shipper (au lieu de Beaver), j’ai vite découvert ses limites en performances lorsqu’on a beaucoup de logs.

Pour régler cela, j’ai découvert l’ajout de REDIS au stack, qui permet d’accélérer vraiment le processus d’Indexer car il ne reçoit plus (logstash) les logs en direct.

Le problème c’est qu’il fallait trouver un shipper de remplacement car Logstash-forwarder ne supporte pas l’envoie à REDIS.

J’ai découvert ensuite Beaver qui fait parfaitement le travail qu’on lui demande et ne bouffe pas toutes les ressources (Python hein !).

Actuellement, mon Stack REDIS-ELK est composé comme ceci :

Un serveur ELK avec 3g RAM et 2vcpu

Un serveur REDIS avec 2g RAM et 2vcpu

Il reçoit les logs de 10 serveurs virtuelles (syslog, auth.log & logs de services) ainsi que les logs de 17 ordinateurs sous Ubuntu 14.04 (syslog et auth.log uniquement).

Cela représente environ 700K logs / jours et grâce à REDIS, les logs arrivent toujours à l’heure !

Quelques liens utiles :

http://www.foulquier.info/tutoriaux/supervision-des-logs-de-serveurs-lamp-debian-avec-elasticsearch-logstash-kibana-et-redis-elk

https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04

https://wooster.checkmy.ws/2014/04/elk-elasticsearch-logstash-kibana/

http://slash4.de/blog/howto/centralized-logging-with-elk-beaver-and-swarm.html

http://brewhouse.io/blog/2014/11/04/big-data-with-elk-stack.html

http://www.everybodyhertz.co.uk/setting-up-a-relk-stack-a-how-to/

http://desaille.fr/elk-et-base-de-donnee-glpi-dashboard/

https://dzone.com/articles/elk-using-centralized-logging

Si vous avez des questions, les commentaires sont là pour ça !