Скользящий файл журнала без потери какого-либо события журнала

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

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

Другие вопросы по тегам