Null after logrotate copytruncate

Я использую 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
}

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

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

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

postrotate
   sed -i -e 's/\o00//g' session.timing.1
endscript

Но поскольку я применяю его к куче файлов, у меня нет конкретного имени, например session.timing.1 Есть ли способ сделать это обобщенно? Я хочу, чтобы эта операция была выполнена для всех файлов typeA_date1.log typeA_date2.log и так далее..... Или вы можете предложить какой-либо другой метод, который может быть полезен здесь?

0
задан 17 November 2020 в 08:39
1 ответ

у меня та же проблема. После прочтения кода logrotate я думаю, что когда программа продолжает писать сообщение журнала с открытым файлом, можно использовать только режим copytruncate, но этот режим также делает дыру в файле с помощью ftruncate и заполните NULL символами.

Несколько советов:

  1. измените метод программы для ведения журнала, который не требует использования режима copytruncate
  2. управляемого systemd с помощью syslog configure, см. как
  3. управляется systemd (версия 236 или новее), который может установить StandardOutput в файл, поэтому, возможно, можно использовать logrotate с режимом create (не уверен)
0
ответ дан 2 April 2021 в 14:18

Теги

Похожие вопросы