У меня есть программа для Linux, которая может записывать информацию в stdout и stderr.
У меня есть сценарий оболочки, который перенаправляет этот вывод в файл в /var/log
. (Через >>
и 2>&1
.)
Есть ли способ заставить этот файл журнала вращаться? (максимальный размер, затем переключитесь на другой файл, оставьте только ограниченное количество файлов)
Я видел несколько ответов, которые говорят о logrotate
программе, которая звучит хорошо, но они также, кажется, сосредоточены на программах, которые генерируют файлы журнала внутри и обрабатывают сигналы HUP. Есть ли способ сделать это с помощью основного сценария перенаправления вывода?
logrotate
если есть лучший вариант, который звучит как удобная отправная точка для обсуждения.Ответы:
В качестве альтернативы вы могли бы направить вывод через инструменты, предназначенные для основной цели - поддерживать наборы журнальных файлов с ограниченным размером, автоматически вращаемыми, такие как:
multilog
из daemontoolsmultilog
из daemontools-бисs6-log
от s6svlogd
из Рунитаtinylog
из Перпcyclog
из ничегоИнструменты для последующей обработки
multilog
форматов файлов журналов включают, среди прочего:multilog-watch
logrange
multilog-stamptail
follow-log-directories
из ничегоexport-to-rsyslog
из ничегодальнейшее чтение
logrotate
илиnewsyslog
в этом веке. , Часто задаваемые ответы.источник
multilog
похоже, именно то, что мне было нужно.multilog
нигде не создаются и не требуются символические ссылки. Это абсолютно нейтрально по отношению к ним.rotatelogs
инструмент поставляется с Apache (вbin
директории) (см документации ) принимает входные данные из стандартного ввода и поворачивает бревно после некоторого определенного количества времениисточник
Если у вас есть возможность перейти к одному из стандартных потоков журналов (syslog, daemon, cron, user, security, mail и т. Д.), Вы можете использовать
logger
команду и канал к нему.В противном случае вам может быть лучше передать записанное содержимое в пользовательскую программу или сценарий для его обработки или посмотреть на настройку
logrotate
конфигурации.РЕДАКТИРОВАТЬ: JdeBP ответ, кажется, есть то, что вы можете искать.
источник
У меня была похожая проблема, и я изначально отказывался от logrotate, но оказалось, что logrotate действительно может это сделать, ключевая директива - copytruncate . По какой-то причине этот термин не встречается ни в одном из поисковиков, которые я использовал, поэтому я добавляю этот ответ, чтобы уточнить, как именно его использовать в данном случае.
Хитрость в том, что это работает, только если перенаправление выполняется с помощью « >> » (добавление) вместо « > » (создание).
Файл конфигурации (truncate.cfg):
Тестовая программа (никогда не сдается файл). Вы можете наблюдать за тем, как он заполняет диск, и хотя удаление файла журнала будет работать, на самом деле оно не освободит место на диске:
Запуск журнала поворота:
источник
echo /dev/urandom >> /tmp/temp.log
мы запишем 13 детерминированных символов/tmp/temp.log
и сразу же завершим работу. Вы имели в видуcat /dev/urandom
?Да! Ознакомьтесь с директивой «copytruncate», предлагаемой logrotate. Указание, которое инструктирует logrotate справиться с этой самой ситуацией: простая программа, которая сохраняет свой файл журнала открытым на неопределенное время.
Одно предупреждение может или не может быть проблемой в вашей ситуации:
Как ни странно, я видел некоторые источники журналов "реального мира", которые поощряют пользователей применять эту директиву. Там какое - то обсуждение этого варианта здесь .
источник
Используйте split, это часть coreutils. Он может взять stdin и разбить его на куски (в зависимости от размера чанка, количества строк и т. Д.).
Пример:
Примечание. Тире (-) указывает «split» использовать stdin вместо файла.
источник
split
выйдет из строя, когда у нее есть данные в том, что может быть большим буфером. Учитывая, что есть несколько инструментов, которые решают эту проблему должным образом, я не думаю, что такое решение может быть рекомендовано вообще.Мне нравится
multilog
мой вариант использования, но мой вариант использования настолько тривиален / прост, что не очень просто изложен в документах / примерах, которые я нашел. Вот простой пример поворота мультилога:Некоторые заметки:
"Note that running processor may block any program feeding input to multilog."
где «процессор» - это'!tai64nlocal'
часть команды* Для многих приложений это плохой выбор для долгосрочного использования. Они позволяют наблюдать за процессом заполнения и вращения бревен быстрее, чем это делают большие бревна.
Наконец, не забудьте nohup, если требуется! С nohup вам не нужны
2>&1
(s = 10e6 и n = 30 здесь):Эта команда должна начать вас.
источник
Я просто хотел добавить к комментарию Сэма Хендли выше:
Хитрость в том, что это работает, только если перенаправление выполняется с помощью
>>
(добавления) вместо>
(создания).Я столкнулся с той же проблемой, когда исходный файл просто продолжает расти, если вы используете
>
(создаете), но если вы используете>>
(добавляете) Logrotate copytruncate работает красиво и как ожидалось. Исходный файл возвращается к нулю байтов, и программа продолжает запись.Перенаправьте STDOUT и STDERR во вращающийся лог-файл:
some-program.sh >> /tmp/output.txt 2>&1 &
Создайте файл конфигурации logrotate под
/etc/logrotate.d
названием any, output_roll в моем случае.Пример конфигурации для моего случая:
Настройте свою работу cron внутри
/etc/crontab
файлаЭто будет проверять файл каждую минуту. Вы можете настроить в соответствии с вашими потребностями.
Начни это:
это оно
Примечание. У меня также была проблема с настройкой SELinux,
SELINUX=enforcing
поэтому я установил его наSELINUX=disabled
.источник
Я написал logrotee в эти выходные. Я бы не стал, если бы прочитал отличный ответ @ JdeBP и
multilog
.Я сосредоточился на том, чтобы он был легким и имел возможность bzip2 его выходных блоков, таких как:
Однако многое еще предстоит сделать и проверить.
источник