web-dev-qa-db-fra.com

Utilisation de logrotate pour gérer les journaux générés par PHP

Mes scripts PHP génèrent des fichiers journaux et j'essaie d'utiliser logrotate pour les gérer.

Fichier /etc/logrotate.d/php-logs:

/srv/cache/*.log {
  daily
  notifempty
  size 800K
  rotate 5
  missingok
  compress
  delaycompress
}

Cela fonctionne, sauf que le processus de rotation du journal coïncide parfois avec PHP essayant d'ajouter le journal.

Quelle est la meilleure façon de résoudre ce problème?

2
bearcat

Certaines options de rotation des journaux pourraient vous aider. Voir copytruncate in http://www.linuxcommand.org/man_pages/logrotate8.html Ceci créera une copie et tronquera le fichier original. Par conséquent, le fichier journal n'a pas besoin d'être fermé et il est maintenu ouvert par votre script php. Certaines instructions de journal peuvent être abandonnées entre les opérations copier et tronquer.

2
Iyad K

Pendant ce temps, ma solution (bandage) est faite dans PHP, mais je réalise que ce n’est peut-être pas la solution la plus appropriée et la plus élégante.

<?php
function log_record($str, $file_name) {
    $n = 0;
    while ($n < 10) {
        if (is_readable($file_name)) {
            file_put_contents($file_name, str_pad($_SERVER["REMOTE_ADDR"], 15, ' ', STR_PAD_RIGHT).' ['.date("Y-m-d H:i:s").'] '. $str . PHP_EOL, FILE_APPEND | LOCK_EX);
            exit;
        }
        usleep(10000); // That's 10 ms, up to 10 times.
    }
}
1
bearcat