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:
plugin munin - monitoring erreurs php

mais vous aurez peut être ça:
plugin munin - monitoring erreurs php

 

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.

Il y a 4 commentaires.

Ecrit par LGnap le 14 nov. 2013

Le plugin semble vraiment sympathique et je pense l'installer asap. Mais serait il possible d'aller l'ajouter dans le repo/folder suivant : https://github.com/munin-monitoring/contrib/tree/master/plugins/php Ce serait vraiment pratique pour facilement le retrouver et suivre ses éventuelles mises à jour ;-) Merci d'avance.

Réponse de Ulrich le 14 nov. 2013

Tu as raison,ça fait logntemps que je voulais le faire mais je n'ai jamais pris le temps. Voilà c'est fait, la PR est en attente, je mettrait à jour l'article avec les liens si elle est acceptée.

Ecrit par Laurent le 20 mai 2012

Le problème de ton plugin c'est que j'ai l'impression qu'il ne fait que le cumul sans variation dans de date/heure

Réponse de Ulrich le 20 mai 2012

Oui il ne fait que cumuler. Le but du plugin était d'avoir une idée des erreurs et de leurs volumes sans avoir à ouvrir les fichiers de logs. Les fichiers de logs sont remis à zéro à intervalle régulier suivant la configuration, il est donc possible dans ce cas de faire un suivis sur cette période mais ce n'était pas le but à l'origine.

Ajouter un commentaire