У меня есть файл размером 8 ГБ php.log
с запущенным скриптом php, входящим в него. Для меня важно, чтобы я регистрировал каждое событие, и я хочу сжать его и очистить текущий файл, не останавливая веб-сервер.
Если я бегу:
mv php.log php.log.backup20140305-01
touch php.log
Я потеряю часть данных. Как я могу сделать это без потери данных?
Вам будет проще настроить 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
Знайте, что вы будете потерять данные таким образом, вам следует выполнять усечение только в том случае, если вы уверены, что у вас есть данные в другом месте, но это полезный трюк, когда вас не слишком заботит содержимое файла журнала и у вас есть непрерывный процесс, записывающий в него.