Consolidation des logs avec rsyslog, MySQL et LogAnalyser

Dès qu’on a plus d’un serveur à gérer il est intéressant de pouvoir centraliser les logs des différentes machines pour en simplifier l’administration. C’est relativement facile avec rsyslog. Ce mini tuto va nous permettre de monter un serveur de logs sous Debian, les logs étant stockées dans une base MySQL.

Configuration du serveur de logs

Si ce n’est pas encore fait, installer et configurer les paquets mysql-client et mysql-server. On installe ensuite les pagets requis par rsyslog :

aptitude install rsyslog rsyslog-doc rsyslog-mysql

La configuration de rsyslog-mysql se fait automatiquement à la fin de l’installation par dbconfig. Avec les options par défaut on aboutit à la création d’une base MySQL nommée Syslog, contenant 2 tables SystemEvents et SystemEventsProperties. L’utilisateur rsyslog@localhost aura le contrôle total sur cette base. Ces informations de connexion sont stockées dans /etc/rsyslog.d/mysql.conf :

### Configuration file for rsyslog-mysql
### Changes are preserved

$ModLoad ommysql
*.* :ommysql:localhost,Syslog,rsyslog,motdepasse

On active ensuite la réception des logs distantes en éditant /etc/rsyslog.conf et en décommentant les lignes correspondantes :

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

On redémarre le démon rsyslog :

/etc/init.d/rsyslog restart

Le serveur est maintenant configuré pour enregistrer les logs dans la base, et il écoute sur le port 514 les messages entrant. On peut vérifier que la table MySQL est bien alimentée avec les logs locales :

mysql -u rsyslog -p -Bsr -e "SELECT Message FROM SystemEvents LIMIT 0,20" Syslog

Attention, si le serveur de logs se trouve derrière un routeur, il faudra penser a activer les règles NAT qui vont bien (redirection du traffic UDP et TCP 514->514 vers le serveur de logs).

Configuration des serveurs distants

Il faut maintenant configurer les autres serveurs pour qu’ils envoient leurs logs au serveur de log. Dans l’exemple j’utilise ici aussi rsyslog mais ça fonctionne aussi avec syslog ou syslog-ng (avec un paramétrage différent).

Installation du paquet :

aptitude install rsyslog

Création d’un répertoire de travail

mkdir /var/spool/rsyslog

On ajoute les lignes suivantes à la fin du fichier /etc/rsyslog.conf (adapter l’adresse du serveur ;-) ):

# Envoi des logs au serveur de logs
$WorkDirectory /var/spool/rsyslog  # default location for work (spool) files
$ActionQueueType LinkedList   # use asynchronous processing
$ActionQueueFileName srvrfwd  # set file name, also enables disk mode
$ActionResumeRetryCount -1    # infinite retries on insert failure
$ActionQueueSaveOnShutdown on # save in-memory data if rsyslog shuts down
*.*       @@adresse.du.serveur.de.logs:514

On redémarre le démon, et c’est tout :

/etc/init.d/rsyslog restart

Installation de LogAnalyser

Retour au serveur de logs pour installer l’interface web Adiscon LogAnalyser qui va nous permettre de visualiser et d’analyser nos messages syslog. On suppose qu’un serveur Apache et PHP 5 sont déjà installés sur le serveur. A l’heure où j’écris la dernière version stable de LogAnalyser est la 3.2.1.

Téléchargement et décompression de l’archive:

wget http://download.adiscon.com/loganalyzer/loganalyzer-3.2.1.tar.gz
tar -xvzf loganalyzer-3.2.1.tar.gz

On crée un répertoire loganalyser à la racine du serveur web:

mkdir /var/www/loganalyser

On copie les fichiers LogAnalyser requis dans ce répertoire:

cp -a loganalyzer-3.2.1/src/* /var/www/loganalyser

On rend le user Apache propriétaire du dossier:

chown -R www-data:www-data /var/www/loganalyser

Avec un navigateur on se rend ensuite à l’adresse http://adresse.du.serveur.de.logs/loganalyser et on configure LogAnalyser en suivant les instructions de l’assistant.
Consulter le fichier /var/www/loganalyser/INSTALL pour des instructions détaillées si besoin.

Une remarque pour conclure, la table MySQL SystemEvents peut se remplir rapidement et devenir très volumineuse. Un petit script de purge placé en cron permettra d’éviter les mauvaises surprises:

#!/bin/bash
# Purge mensuelle des logs de la base MySQL Syslog
RETENTION=180 # Durée de rétention des logs (en jours)
# Paramètres MySQL
MYSQL_HOST="localhost"
MYSQL_DB="Syslog"
MYSQL_USER="rsyslog"
MYSQL_PASSWD="motdepasse"
# Suppression des enregistrements MySQL
sql="DELETE FROM SystemEvents WHERE DATEDIFF(NOW(), DeviceReportedTime) > $RETENTION"
mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWD -e "$sql" -B -s $MYSQL_DB

Leave a Reply

Your email address will not be published. Required fields are marked *