У меня есть простой скрипт, который выводит кучу журналов на экран, и я отправил STDOUT в файл для хранения журналов. Поскольку этот сценарий выполняется долго, мне нужно было повернуть файлы журнала, чтобы они были разбиты на более мелкие и более управляемые.
Проблема, с которой я столкнулся, заключалась в том, что когда-то logrotate
перемещает текущий файл журнала в новый, вновь созданный файл журнала больше не заполняется журналами. Похоже, что после удаления исходного файла журнала его обработчик файла теряется, и перенаправление больше не работает.
Я также нашел эта почта у которого была та же проблема, что и у меня, и утверждает, что ее можно исправить с помощью >>
вместо того >
для перенаправления вывода. Я протестировал его решение, но у меня оно не сработало. Кто-нибудь знает, как сохранить перенаправление?
Вы должны использовать директиву copytruncate в конфигурации logrotate для этого файла журнала.
copytruncate Обрезать исходный файл журнала на месте после создания копии, вместо того, чтобы перемещать старый файл журнала и, при необходимости, создавать новый. Его можно использовать, когда какой-либо программе нельзя приказать закрыть свой файл журнала, и поэтому она может продолжать писать (добавлять) в предыдущий файл журнала бесконечно. Обратите внимание, что между копированием файла и его усечением есть очень маленький промежуток времени, поэтому некоторые данные журнала могут быть потеряны. Когда используется эта опция, опция создания не будет иметь никакого эффекта, так как старый файл журнала останется на месте.
В качестве альтернативы вы также можете:
используйте утилиту logger в своем скрипте вместо конвейера со специальным средством (например, local5), например:
logger -p local5.info -t myscriptname "this is some log data"
сконфигурируйте syslog для записи этой возможности в требуемый файл журнала, например (rsyslog.conf):
local5.* /var/log/mylogfile
настроить правило logrotate для этого журнала.
Другой альтернативой решению Iain является использование postrotate
скрипт, чтобы перезапустить ваш скрипт после того, как ротация произошла. Это делается для множества демонов (перезапуск или перезагрузка демона), но, не зная вашего скрипта, я не знаю, подойдет ли вам это решение (зависит ли ваш скрипт от какого-то состояния, сгенерированного некоторое время назад?).
Содержание /etc/logrotate.d/your-script-name
:
/var/log/your-script-name.log {
# your current logrotate options
...
postrotate
# this supposing you have the current pid stored
cat /run/your-script-name.pid | xargs -r kill
#relaunch it again
/usr/local/bin/your-script-name
endscript
}
Вы можете направить stdout в раздел «split» (часть coreutils в Linux). Он позволяет вам разбивать файл / стандартный ввод на куски в зависимости от размера, количества строк и т. Д. После того, как вы разбили его, вы можете управлять им с помощью logrotate, если это необходимо.