Mettre en place une notification par email des erreurs PHP
Être notifié rapidement des erreurs PHP apparaissant sur un serveur permet d'être réactif lors qu'un problème se pose sur un site en production. Ce guide vous propose une solution pour mettre en place de telles notifications.
Ce guide est testé sur:
- Debian 5.0 Lenny
- Debian 6.0 Squeeze
Prérequis
Ce guide nécessite:
- une installation fonctionnelle de PHP, telle que décrite par Installer PHP-FPM sur Debian.
- la journalisation des erreurs PHP avec Syslog, comme décrit par Journaliser les erreurs PHP avec Syslog.
Installation
Installez le Simple Event Correlator:
command apt-get install sec
Créez le dossier pour les fichiers de configuration:
command mkdir --parents "/etc/sec"
Créez le fichier de configuration de la notification par e-mail des erreurs PHP pour Apache 2:
command echo '# Capture error lines and store them in php-errors type=Single ptype=RegExp pattern=^\[.+\] \[error\] \[client .+\] PHP .+$ desc=PHP error or warning action=add php-errors $0 # Report errors every minute if php-errors is set type=Calendar time=* * * * * desc=Mail PHP errors context=php-errors action=report php-errors /usr/bin/mail -s "PHP errors" root@localhost; delete php-errors; ' > "/etc/sec/apache2-php-errors.conf"
Créez le fichier de configuration de la notification par e-mail des erreurs PHP pour LigHTTPd:
command echo '# Capture error lines and store them in php-errors type=Single ptype=RegExp pattern=^.+: \(mod_fastcgi\.c\..+\) .+$ desc=PHP error or warning action=add php-errors $0 # Report errors every minute if php-errors is set type=Calendar time=* * * * * desc=Mail PHP errors context=php-errors action=report php-errors /usr/bin/mail -s "PHP errors" root@localhost; delete php-errors; ' > "/etc/sec/lighttpd-php-errors.conf"
Créez le fichier de configuration de la notification par e-mail des erreurs PHP pour Syslog:
command echo '# Capture error lines and store them in php-errors type=Single ptype=RegExp pattern=^.+: PHP .+$ desc=PHP error or warning action=add php-errors $0 # Report errors every minute if php-errors is set type=Calendar time=* * * * * desc=Mail PHP errors context=php-errors action=report php-errors /usr/bin/mail -s "PHP errors" root@localhost; delete php-errors; ' > "/etc/sec/syslog-php-errors.conf"
Configurez le démon de notification pour le serveur HTTP installé:
if [ -n "$(command grep '/php.log' '/etc/syslog-ng/syslog-ng.conf')" ]; then
command echo '
# PHP monitoring defaults
RUN_DAEMON="yes"
DAEMON_ARGS="-conf=/etc/sec/syslog-php-errors.conf -input=/var/log/php.log -pid=/var/run/sec.pid -detach -syslog=daemon"
' >> "/etc/default/sec"
elif [ -d "/var/log/apache2" ]; then command echo ' # PHP monitoring defaults RUN_DAEMON="yes" DAEMON_ARGS="-conf=/etc/sec/apache2-php-errors.conf -input=/var/log/apache2/*error.log -pid=/var/run/sec.pid -detach -syslog=daemon" ' >> "/etc/default/sec" elif [ -d "/var/log/lighttpd" ]; then command echo ' # PHP monitoring defaults RUN_DAEMON="yes" DAEMON_ARGS="-conf=/etc/sec/lighttpd-php-errors.conf -input=/var/log/lighttpd/*error.log -pid=/var/run/sec.pid -detach -syslog=daemon" ' >> "/etc/default/sec" fi
Lancez le démon:
/etc/init.d/sec start
Le compte root du système reçoit maintenant des e-mails le notifiant des erreurs PHP apparues dans les journaux du serveur HTTP.
Niveau des erreurs signalées
Si vous ne contrôlez pas les applications installées sur le serveur (logiciels libres par exemple), assurez-vous que les notifications PHP ne sont pas ajoutées au journal d'erreur:
echo "; PHP error log level
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE" \
> '/etc/php5/conf.d/error_reporting.ini'
Rechargez la configuration de PHP:
test -x /etc/init.d/php5-fpm && /etc/init.d/php5-fpm restart
test -x /etc/init.d/apache2 && /etc/init.d/apache2 force-reload
test -x /etc/init.d/lighttpd && /etc/init.d/lighttpd force-reload
test -x /etc/init.d/nginx && /etc/init.d/nginx force-reload
Remerciements
- Merci aux développeurs de S.E.C., the Simple Event Correlator (en).
- Merci à Garret de powdahound.com (en) pour son article Emails alerts for PHP errors via SEC (en).
- Merci à GuiguiAbloc (fr) pour m'avoir fait découvrir S.E.C. dans son article Interception des erreurs applicatives dans Nagios avec SEC et Prelude-lml (fr).