Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / Syslog / Journaliser les erreurs PHP avec Syslog

Journaliser les erreurs PHP avec Syslog

Par Pierre-Yves Landuré Dernière modification 16/08/2018 17:46

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:

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