Нулевое значение в начале журнала после logrotate

Я использую logrotate для управления своими журналами. Поскольку мне приходится управлять кучей лог-файлов. Моя конфигурация logrotate выглядит так

/log/typeA*.log
/log/typeB*.log
/log/typeC*.log{
        daily
        rotate 7
        copytruncate
        size 1M
        compress
        su root root
        create 0644 root root
        missingok
}

После завершения logrotation я вижу кучу нулевых символов в начале файла. Который выглядит как

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

Похоже на бесконечно длинную строку. Также размер файла выглядит одинаково. Существует решение, предложенное https://serverfault.com/a/510470 для использования сценария постротации, например

postrotate
   sed -i -e 's/\o00//g' "$1"
endscript

Но использование этого скрипта изменит файл и изменит поток. Таким образом, журналы не будут перенаправлены в несуществующий файловый поток.
Я генерирую журналы, используя модуль ведения журнала python.


person Pranjal Doshi    schedule 17.11.2020    source источник


Ответы (1)


То же самое случилось со мной, и я смог это исправить.

Причина в том, что вращающийся файл не открывается с флагом O_APPEND. Поэтому при вращении он по-прежнему сохраняет то же смещение записи и начинает запись с середины нового файла. Все, что находится до этого смещения, помечается как NULL, так как начало файла пусто.

Другими словами, вы заканчиваете запись символа с номером n в файл и усекаете его, когда запускается ротация. Вместо того, чтобы снова начинать с символа с номером 0, вы продолжаете с символа с номером n+1, и первые n символов будут помечены как NULL.

Чтобы избежать этой проблемы, вы должны открыть файл с флагом O_APPEND.

Дополнительную информацию можно найти в следующей теме: https://groups.google.com/g/comp.unix.solaris/c/Zc7ysjMGprQ?pli=1

person Gabriel Mermelstein    schedule 26.05.2021