Journaliser les erreurs PHP avec Syslog
Suivant la configuration du serveur, les messages PHP ne sont pas stockés dans les journaux d'erreur du serveur HTTP utilisé. Dans ce cas, il est nécessaire de configurer PHP pour enregistrer les erreurs dans un fichier dédié, ou mieux, vers Syslog. Cet article présente une configuration simple pour enregistrer les messages d'erreurs PHP générés par les sites hébergés dans le fichier "/var/log/php.log".
Ce guide est testé sur:
- Debian 6.0 Squeeze
- Debian 7.0 Wheezy
- Debian 9.0 Stretch
- Ubuntu 16.04 Xenial Xerus
Prérequis
Ce guide nécessite:
- un serveur HTTP avec support du PHP, comme décrit par Installer PHP-FPM sur Debian.
- php-tools, l'outil de configuration simplifiée de PHP.
Installation
Détectez le proxy de commande (command ou sudo):
cmdProxy='command'
command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'
Rsyslog
Configurez RSyslog (si présent) pour enregistrer les messages de PHP dans un fichier dédié:
if [ -d '/etc/rsyslog.d' ]; then
echo '# Log PHP messages to /var/log/php.log.
:msg,regex,"^[w: ]*PHP " /var/log/php.log
:msg,startswith," [wrapped:" /var/log/php.log
# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging PHP log messages to syslog default file.
& ~' | ${cmdProxy} tee '/etc/rsyslog.d/40-php.conf'
fi
Créez le fichier log pour PHP:
if [ -d '/etc/rsyslog.d' ]; then
${cmdProxy} touch '/var/log/php.log'
${cmdProxy} chown "$(command grep '$FileOwner' '/etc/rsyslog.conf' | command cut --delimiter=' ' --fields=2)":adm '/var/log/php.log'
${cmdProxy} chmod 640 '/var/log/php.log'
fi
Rechargez la configuration de RSyslog:
test -x /etc/init.d/rsyslog && ${cmdProxy} service rsyslog force-reload
Syslog-NG
Renseignez la configuration pour Syslog-NG:
SYSLOG_NG_CONF='
########################
# PHP messages
########################
destination d_php { file("/var/log/php.log"); };
filter f_php { program("^php"); };
log { source(s_src); filter(f_php); destination(d_php); };'
Configurez Syslog-NG (si présent) pour enregistrer les messages de PHP dans un fichier dédié:
if [ -d '/etc/syslog-ng/conf.d' ]; then
echo "${SYSLOG_NG_CONF}" | ${cmdProxy} tee '/etc/syslog-ng/conf.d/php.conf'
elif [ -e '/etc/syslog-ng/syslog-ng.conf' \
-a -z "$(command grep 'PHP messages' '/etc/syslog-ng/syslog-ng.conf' 2>'/dev/null')" ]; then
echo "${SYSLOG_NG_CONF}" | ${cmdProxy} tee -a '/etc/syslog-ng/syslog-ng.conf'
fi
Créez le fichier log pour PHP:
if [ -d '/etc/syslog-ng/' ]; then
${cmdProxy} touch '/var/log/php.log'
${cmdProxy} chown root:adm '/var/log/php.log'
${cmdProxy} chmod 640 '/var/log/php.log'
fi
Rechargez la configuration de Syslog-NG:
test -x /etc/init.d/syslog-ng && ${cmdProxy} service syslog-ng reload
PHP
Configurez PHP pour journaliser les messages via Syslog:
${cmdProxy} php-tools --add-mod --mod-name 'syslog' --mod-settings '; PHP errors logged to syslog:
error_log = syslog'
Rechargez la configuration de PHP:
${cmdProxy} php-tools --reload
Affichez les messages générés par PHP avec:
${cmdProxy} tail -f '/var/log/php.log'
En complément de cette configuration, il est possible de mettre en place une notification par email des erreurs PHP.
Logrotate
Configurez la rotation des journaux d'erreurs PHP:
echo "/var/log/php.log {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 640 root adm
}
/var/log/php.log.slow {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 644 www-data adm
}" \
| ${cmdProxy} tee "/etc/logrotate.d/php"
Remerciements
- Merci aux développeurs de PHP (en).
- Merci aux développeurs de RSyslog (en).
- Merci aux développeurs de Syslog-NG (en).
- Merci à Admin Linux pour Mémo syslog-NG (fr).