Як продовжити перенаправлення stdout до файлу після того, як логротат перемістить його?


22

У мене є простий скрипт, який виводить на журнал купу журналів, і я передав STDOUT у файл для зберігання журналів. Оскільки цей скрипт триває, мені потрібно було обертати файли журналів, щоб вони були розміщені на більш дрібних керованих.

Проблема, з якою я зіткнулася, полягала в тому, що після logrotateпереміщення поточного файлу журналу в новий, новостворений файл журналу більше не заповнюється журналами. Здається, що після видалення оригінального файлу журналу його обробник файлів втрачається, а перенаправлення більше не працюватиме.

Я також знайшов цю посаду, яка мала ту ж проблему, що і я, і стверджує, що її можна виправити, використовуючи >>замість того, >щоб перенаправляти вихід. Я перевірив його рішення, але це не спрацювало для мене. Хтось має ідею, як зберегти роботу перенаправлення?


4
Я все-таки рекомендую, у вашому випадку використовувати ">>" замість ">", якщо ви маєте намір записати в усічений файл: як ">>" відкрити в режимі додавання, він буде шукати до кінця файлу щоразу, коли пише. Таким чином, коли ви усікаєте файл (примушуючи його переходити від XXXX байт до 0 байт), він "шукатиме до кінця", тому знатиме, що він повинен писати після байту 0. Інакше він може писати після байта XXXX, і таким чином створити розріджений файл з нульовими байтами XXXX (тобто, коли ">", fd може просто запам'ятати, де він був у цьому файлі, і писати звідти, не усвідомлюючи зменшення розміру файлу!)
Олів'є Дулак

Відповіді:


25

Ви повинні використовувати директиву copytruncate у своєму конфігурації logrotate для цього файлу журналу.

copytruncate Обрізати оригінальний файл журналу після створення копії замість переміщення старого файлу журналу та необов'язково створення нового. Її можна використовувати, коли якійсь програмі не можна сказати закрити свій файл реєстрації і, таким чином, може продовжувати писати (додавати) до попереднього файлу журналу назавжди. Зауважте, що між копіюванням файла та обрізанням файлу існує дуже маленький відрізок часу, тому деякі дані журналу можуть бути втрачені. Якщо використовується ця опція, опція створення не матиме ефекту, оскільки старий файл журналу залишається на місці


2
Можливо, варто згадати: За короткий час, перед compressоперацією, дані дублюються. Це викликало у нас проблему одного разу, але це було нашим погано, оскільки ми не повинні були бути наближеними до lvпростору. Крім того, як зазначено в manфрагменті, ви можете втратити деякі дані журналу між операціями копіювання та обрізання.
Белмін Фернандес

6

В якості альтернативи ви також можете:

  • використовуйте утиліту реєстратора у вашому сценарії замість трубопроводів із виділеним засобом (наприклад, local5), наприклад:

    logger -p local5.info -t myscriptname "this is some log data"

  • налаштуйте syslog для запису цього засобу у потрібний файл журналу, наприклад (rsyslog.conf):

    local5.* /var/log/mylogfile

  • правило налаштування для цього журналу.


Це працює лише в тому випадку, якщо у вас є явні вихідні команди на зразок echo. Вихід сторонніх інструментів, які викликаються із сценарію, а також виводять щось, не можна перенаправляти на реєстратор таким чином
Даніель Алдер

4

Ще одна альтернатива рішенню 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
}

0

Ви можете передавати stdout до "розколу" (частина coreutils в Linux). Це дозволяє розділити файл / stdin на шматки залежно від розміру, кількості рядків і т. Д. Після того, як ви отримаєте його, ви можете управляти ним за допомогою logrotate, якщо це необхідно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.