Скользящий файл журнала без потери какого-либо события журнала
У меня есть файл 8GB называется php.log
с запущенным PHP-скриптом, входящим в него. Для меня важно, чтобы я регистрировал каждое событие, и я хочу сжать его и очистить текущий файл, не останавливая веб-сервер.
Если я бегу:
mv php.log php.log.backup20140305-01
touch php.log
Я потеряю некоторые данные. Как я могу сделать это без потери каких-либо данных?
2 ответа
Вам будет проще настроить logrotate
сделать вращение для вас. Если вы создаете файл с именем /etc/logrotate.d/php
содержащий что-то вроде следующего, он будет обрабатывать ротацию журнала автоматически. Это всего лишь руководство, поэтому обязательно протестируйте и настройте его, прежде чем запускать в производство.
/path/to/php.log {
daily
missingok # don't rotate if the file isn't there...
notifempty # ...or if it's zero-length
rotate 30 # keep 30 days' worth of logs
compress # gzip the logs, but...
delaycompress # ...only after they're over a day old
create 640 root adm # permissions with which to create new files
sharedscripts
postrotate
/etc/init.d/apache2 graceful # or whatever makes your process let go of the log file
endscript
}
NB: комментарии в этом фрагменте logrotate
синтаксис, так что не забудьте удалить их из вашего живого конфигурационного файла.
Вы должны использовать logrotate, как сказал Flup, но быстрый способ сгладить / усечь файл журнала, не нарушая дескрипторы текущего файла:
> /path/to/php.log
Имейте в виду, что при этом вы потеряете данные, поэтому урезать их следует только в том случае, если вы уверены, что у вас есть данные в другом месте, но это полезный прием, когда вас не слишком заботит содержание файла журнала и у вас есть непрерывный процесс записи в него.