Назад | Перейти на главную страницу

Прокрутка файла журнала без потери каких-либо событий журнала

У меня есть файл размером 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

Знайте, что вы будете потерять данные таким образом, вам следует выполнять усечение только в том случае, если вы уверены, что у вас есть данные в другом месте, но это полезный трюк, когда вас не слишком заботит содержимое файла журнала и у вас есть непрерывный процесс, записывающий в него.