logrotate работает некорректно
Я использую:
Linux workdesk 3.16.0-31-generiC#43~14.04.1-Ubuntu SMP Вторник, 10 марта 20:13:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Идентификатор распространителя: Ubuntu
Описание: Ubuntu 14.04.2 LTS
Релиз: 14.04
Кодовое имя: верный
logrotate 3.8.7-1ubuntu1 amd64
Я пытался протестировать поведение logrotate.
мой файл conf:
/home/user/test/*.log {
daily
rotate 2
ifempty
su user user
}
ls /home/user/test/*.log
выходы
/home/user/test/1.log
sudo logrotate -fv /etc/logrotate.d/r
выходы
reading config file /etc/logrotate.d/r
Handling 1 logs
rotating pattern: /home/user/test/*.log forced from command line (2 rotations)
empty log files are rotated, old logs are removed
switching euid to 1000 and egid to 1000
considering log /home/user/test/1.log
log needs rotating
rotating log /home/user/test/1.log, log->rotateCount is 2
dateext suffix '-20150327'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /home/user/test/1.log.2 to /home/user/test/1.log.3 (rotatecount 2, logstart 1, i 2),
old log /home/user/test/1.log.2 does not exist
renaming /home/user/test/1.log.1 to /home/user/test/1.log.2 (rotatecount 2, logstart 1, i 1),
old log /home/user/test/1.log.1 does not exist
renaming /home/user/test/1.log.0 to /home/user/test/1.log.1 (rotatecount 2, logstart 1, i 0),
old log /home/user/test/1.log.0 does not exist
log /home/user/test/1.log.3 doesn't exist -- won't try to dispose of it
renaming /home/user/test/1.log to /home/user/test/1.log.1
switching euid to 0 and egid to 0
и после ls
выходы
1.log.1
и это все
Может кто-нибудь объяснить вращение процесса?
1) Что такое "переименование /home/user/test/1.log.0 в /home/user/test/1.log.1"? Если у меня есть счетчик поворота = 0
2) Где находится файл 1.log?
3) где находится 1.log.0? Насколько я понимаю, я должен получить только 1.log пустой файл и все
1 ответ
Ваш файл конфигурации просит повернуть файл *.log
в /home/user/test
каждый день, даже если файл пуст и сохраняются два старых файла.
logrotate выполняет это действие (как вы можете видеть в подробном выводе):
- изменить пользователя и группу (из-за
su user user
) - переименуйте старые журналы, если они существуют, начиная с
1.log.2
(из-заrotate 2
) - Удалить
1.log.3
если существует (из-заrotate 2
) - переименовать текущий
1.log
в1.log.1
- переключить обратно пользователя и группу
Итак, как и ожидалось, в конце вы нашли 1.log.1
что это должно быть 1.log
файл переименован.
При переименовании процесса печатается ошибка, но logrotate не завершается ошибкой, если старый файл журнала не существует, который еще не был создан в предыдущие дни.
Если приложение пишет в 1.log
, после ротации журнала, он все еще пишет в 1.log.1
потому что переименование файла не меняет его индекс. В этом случае вы должны заставить приложение закрыть текущий файл журнала и снова открыть его, используя его изящный перезапуск.
Вот полезная ссылка о том, как это сделать.
Я не могу объяснить, почему logrotate пытается переименовать 1.log.0
Кажется, ошибка реализации, которая не вызывает каких-либо ошибок.