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?
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.
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.
}
}