У меня есть простой скрипт, который выводит несколько журналов на экран, и я передал STDOUT в файл для хранения журналов. Поскольку этот скрипт долго выполняется, мне нужно было повернуть файлы журналов, чтобы они были разбиты на более мелкие и более управляемые.
Проблема, с которой я столкнулся, заключалась в том, что после logrotate
перемещения текущего файла журнала в новый, вновь созданный файл журнала больше не заполняется журналами. Кажется, что после удаления исходного файла журнала его обработчик файлов теряется и перенаправление больше не будет работать.
Я также нашел этот пост, в котором была та же проблема, что и у меня, и утверждает, что его можно исправить, используя >>
вместо >
перенаправления вывод. Я проверил его решение, но оно не сработало для меня. У кого-нибудь есть идеи, как сохранить работу перенаправления?
Ответы:
Вы должны использовать директиву copytruncate в вашей конфигурации logrotate для этого файла журнала.
источник
compress
операции, данные дублируются. Это однажды вызвало у нас проблему, но это было плохо, потому что мы не должны были быть так близко кlv
пределу пространства. Кроме того, как указано воman
фрагменте, вы можете потерять некоторые данные журнала между операциями копирования и усечения.В качестве альтернативы вы также можете:
используйте утилиту logger в вашем скрипте вместо конвейера со специальным средством (например, local5), например:
logger -p local5.info -t myscriptname "this is some log data"
Сконфигурируйте syslog, чтобы записать эту возможность в нужный файл журнала, например (rsyslog.conf):
local5.* /var/log/mylogfile
настроить правило logrotate для этого журнала.
источник
echo
. Вывод сторонних инструментов, которые вызываются из скрипта и также выводят что-то, не может быть перенаправлен в логгер таким образомДругой альтернативой Iain-решения является использование
postrotate
скрипта для повторного запуска скрипта после ротации. Это делается для большого количества демонов (перезапустите или перезагрузите демон), но не зная вашего сценария, я не знаю, подойдет ли вам это решение или нет (зависит ли ваш сценарий от какого-то состояния, сгенерированного некоторое время назад?).Содержание
/etc/logrotate.d/your-script-name
:источник
Вы можете направить stdout в «split» (часть coreutils в linux). Он позволяет вам разбивать файл / стандартный ввод на куски в зависимости от размера, количества строк и т. Д. После того, как вы получите его, вы можете при необходимости управлять им с помощью logrotate.
источник