Skip to content

Monitorer ses logs avec Redis & ELK

elkVous 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.

kibanaexample

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_logo

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) :

stackrelk

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 :

  1. L’installation de ElasticSearch
  2. L’installation de Logstash
  3. L’installation de Kibana
  4. L’installation de REDIS
  5. L’installation de Beaver (log shipper)
  6. La mise en relation du tout le stack
  7. 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

elast

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

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

kibanalogo

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

redis_logo

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 :

1-select-index

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 :

kibana-first-view

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 :

kibana-typeLe 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.
  • Visualize – 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.
  • 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 :

kibana-clean
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 !

Published inLinuxMonitoringTutoriel

18 Comments

  1. Super tuto, mais Beaver fait que planter (queue timeout of 60 seconds exceeded stopping queue) 🙁

    • valentin valentin

      Salut,
      Je n’ai jamais eu ce soucis. Tu peux essayer de grossir le timeout à 43200 (vu sur Github).
      queue_timeout: 43200

  2. Benji Benji

    Bonjour, merci pour ce fabuleux tuto !!

    Voici ma configuration actuelle:

    1 VM avec installer REDIS
    1 VM avec ELK + Beaver

    Cependant lorsque je restart le service Beaver il me dit  » permission non accordée  »

    Merci beaucoup , Benji

    • valentin valentin

      Salut,
      Fais-tu cette commande en root ?

  3. Benji Benji

    Hello,

    Tout fonctionne correctement merci beaucoup. Maintenant le seul problème est au niveau de la configuration de l’index pattern, je n’ai pas la possibilité de choisir le Time Field Name ce qui veut dire qu’il y a un soucis de communication entre Kibana et le Logstash très certainement.

    Merci

    • valentin valentin

      Salut, as-tu essayé de remplacer l’index Pattern par une « * » ? Si ça marche pas, il se peut que t’es logs n’arrivent pas. Essaie de regarder tes fichiers de logs, tu trouveras sûrement le problème.

  4. Benji Benji

    Hello oui merci ça avance maintenant je récupère bien tout mes syslog sous forme d’histogramme c’était en effet un problème dans mon logstash.conf.

    Comment faire si je veux récupérer les adresses IP source destination ainsi que le hachage md5 afin de les afficher sur Kibana?

    • valentin valentin

      Désolé du retard, j’ai loupé la notif’ :p
      Je dirais qu’il faut que tu fasses ton propre paterne en fonction de tes logs.
      Il y a de bon tutos pour logstash, faut juste les trouver 😉 bon courage.

  5. valentin valentin

    Supre tuto, Merci !

    • valentin valentin

      Merci 🙂
      J’en referais un car celui ci n’est plus forcément très à jours ! Stay tunned 🙂

  6. Benny Benny

    Hello,
    Merci pour le tuto. Au niveau de l’architecture, est-il utile d’ajouter un autre broker entre logstash et elastic ? en cas de défaillance du noeud elastic. Je fais appel aussi à ton recul sur ces derniers mois de production de logs.

  7. Lucas Lucas

    Bonjour, les librairies nécessaires sont elles compatibles avec un RaspberryPi sous Raspbian Jessie ?

  8. Crackers Crackers

    Sympas le tuto. Le truc qui est dommage avec ELK, dans une infra entreprise multi tenant l’authentification sur un annuaire LDAP est payant … Bon c’est normal il faut bien qu’il se fasse de l’argent.
    Une alternative intéressante est l’utilisation de graylog. Les graph et dashboard ne sont pas aussi beau. Mais c’est un très bon produit.

    • valentin valentin

      Hello,
      Le LDAP concerne Kibana ou ES ? car ça peut s’outrepasser avec une authentification Nginx par exemple (relié au LDAP).
      Graylog est sympa, j’ai voulus faire un article dessus, mais j’avais pas assez testé.

  9. Bonjour,

    je voudrais utilise une architecture similaire mais pour des :
    – switchs Cisco
    – Carte ASA
    – Ironport Cisco

    D’une part est -ce que cela fonctionne ? et d’autre part que faut-il indiquer comme serveur syslog ? est-ce l’adresse ip du serveur redis

    D’avance merci pour ton aide.

  10. roms227 roms227

    Bonjour,

    Anciennement : Plein de scripts bash qui écrivent leurs résultats dans un fichier central à partir duquel le cacti vient lire les champs et générer un graph.

    Maintenant : Installation de ELK : OK.

    Mes scripts restent où ils sont ? Ou je dois copier leur contenu pour les mettre dans un fichier de conf de logstash ?
    (Une fois cela compris…) Comment je monte un graph à partir des champs comme à l’ancienne ave Cacti ?

    Cdt

    • valentin valentin

      Bonjour Romain,
      Déjà cela dépend de ce que tes scripts remontent car si c’est seulement RAM/Disque/CPU/NET… tu peux utiliser un outils comme Beaver (`pip install beaver`).

      Sinon tu peux effectivement remonter tes scripts grâce à Logstash ou les enregistrer directement dans Elasticsearch avec cUrls.
      Ensuite il faudra que tu te monte un Dashboard et des graphs de tes métriques maison dans Kibana.

      Cela répond à tes questions ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Proudly hosted with Open-sources Softwares.