Plugin pour monitorer les erreurs PHP avec Munin
En production on n'affiche jamais les erreurs (si les choses sont biens faites) et on les stocks dans des fichiers de logs sur le serveur. Mais comme tout fichier de logs à moins de ne pas avoir le choix, on évite de regarder leur contenu. Utilisant Munin pour monitorer le serveur je me suis donc créer un plugin qui trace les erreurs PHP stockées dans les fichiers de logs.
J'ai plusieurs sites sur mon serveur et j'ai fais le choix d'avoir des fichiers de logs séparés pour chaque site. Ils sont stockés dans /home/user/lesite1/logs/
Le plugin munin est écrit pour parser qu'un seul fichier de logs et je l'instancie pour chaque site que je veux surveiller.
La première chose à faire est d'activer la rotation de logs si vous ne voulez pas que Munin passe 3 minutes à parser les fichiers.
Pour cela ajoutez le code suivant dans un fichier dans le dossier /etc/logrotate.d/
/home/user/*/logs/*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate /etc/init.d/apache2 reload > /dev/null endscript }
Pour être sur de sa config vous pouvez lancer la commande suivante:
> logrotate -f /etc/logrotate.conf
Le plugin parse le fichier d'erreur à la recherche des erreurs PHP: Warning, Notice, Fatal mais aussi des erreurs apache File Not Found.
Copier le code suivant dans le fichier /usr/share/munin/plugins/apache_log
#!/bin/sh # # Plugin to monitor error.log from apache server. # Revision 0.1 2011/06/17 12:00:00 Ulrich Lusseau # Initial revision # # Parameters: # # config (required) # autoconf (optional - used by munin-config) # # Magick markers (optional): #%# family=auto #%# capabilities=autoconf # config example for /etc/munin/plugin-conf.d/munin-node #[apache_log] #user root #env.logfile /home/newsite/logs/errors.log # LOG=${logfile:-/var/log/apache2/error.log} if [ "$1" = "autoconf" ]; then if [ -r "$LOG" ]; then echo yes exit 0 else echo no exit 1 fi fi if [ "$1" = "config" ]; then echo 'graph_title PHP Errors from ' $LOG echo 'graph_args --base 1000 -l 0' echo 'graph_vlabel Errors' echo 'LogWarning.label PHP Warning errors' echo 'LogNotice.label PHP Notice errors' echo 'LogFatal.label PHP Fatal errors' echo 'LogFile.label File does not exist errors' echo 'LogPhpMyAdmin.label PhpMyAdmin call' exit 0 fi awk 'BEGIN{c["LogWarning"]=0;c["LogNotice"]=0;c["LogFatal"]=0;c["LogFile"]=0;c["LogPhpMyAdmin"]=0; } /PHP Warning/{c["LogWarning"]++} /PHP Notice/{c["LogNotice"]++} /PHP Fatal error/{c["LogFatal"]++} /File does not exist/{c["LogFile"]++} /phpmyadmin/{c["LogPhpMyAdmin"]++}a END{for(i in c){print i".value " c[i]} }' < $LOG
Si vous êtes observateur vous verez que je monitore aussi les appels à phpmyadmin, c'est mon coté parano.
Une fois le fichier en place il faut l'activer dans munin en créant un lien vers le plugin depuis /etc/munin/plugins/
> cd /etc/munin/plugins/ > ln -s /usr/share/munin/plugins/apache_log apache_log_site1
Puis il faut ajouter la configuration:
> vim /etc/munin/plugin-conf.d/munin-node
[apache_log_site1] user root env.logfile /home/user/site1/logs/error.log
Ne reste plus qu'à répeter le lien et la config pour chaque site que vous voulez monitorer et relancer munin-node
> /etc/init.d/munin-node restart
Idéalement vous devriez avoir un graphique qui ressemble à ça:
mais vous aurez peut être ça:
J'espère que ce petit plugin vous sera autant utile qu'a moi.
EDIT: le plugin est disponible dans le dépot contrib-plugin de Munin sur github.
Réponse de Ulrich le 14 nov. 2013