Я посмотрел на некоторые другие приложения, и, очевидно, есть опция postrotate
и опция copytruncate
.Опция copytruncate проще, но я думаю, что она менее надежна, поскольку буферы не могут быть сброшены (т. Е. Следуйте ответу @Jarek Potuik), и даже если они таковые, вы можете получить дублирующиеся записи или пропущенные записи.хотите параметр postrotate
:
Параметр postrotate
позволяет запустить команду, чтобы приложение сообщило, что нужно открыть файл (закрыть, а затем открыть).Открывая и закрывая файл в Java, вы делаете это с помощью синхронизированного блока или какой-либо блокировки и, конечно, очищаете все буферы.
Предположим, что ваше приложение называется myapp
:
В /etc/logrotate.d/myapp
у вас будет файл, похожий на:
/var/log/myapp/*.log {
weekly
missingok
rotate 20
compress
delaycompress
notifempty
sharedscripts
postrotate
/etc/init.d/myapp rotate-logs > /dev/null
endscript
}
Команда /etc/init.d/myapp rotate-logs
должна будет подать сигнал приложению о закрытии и повторном открытии файлов журнала.
Часть сигнализации довольно сложна и зависит от того, какое у вас приложение, потому что Java не очень хорошо поддерживает IPC (например, сигналы Unix), поэтому вам, возможно, придется открыть порт или использовать существующий порт, такой как8080 (т. Е. Команда HTTP REST в случае контейнера сервлета), чтобы сообщить приложению закрыть и снова открыть файлы журнала.