Оберніть відкритий і записуваний файл у будь-який час


10

У мене є програма Linux, яка постійно записує інформацію про реєстрацію у файл журналу, наприклад. /var/log/application.log. Оскільки програма не обертає файл автоматично, цей файл журналу може досягати розміру гігабайт за кілька тижнів, тому я хочу мати можливість обертати цей файл належним чином

Моє головне занепокоєння тут полягає в тому, що для обертання файлу, який відкривається додатком, я, напевно, повинен:

  1. Перемістіть файл у повернутий форму /var/log/application.log -> /var/log/application.log.2013-01-28

  2. Створення порожній /var/log/application.log. Висновки: На даний момент процес подання заявки все ще пише/var/log/application.log.2013-01-28

  3. Змініть дескриптор файлу процесу подання заявки, щоб знову вказувати на /var/log/application.log

Отже, я маю рацію? Якщо так, то як я можу це зробити? (в основному змінюється частина дескриптора файлу)

Якщо я це не так, то як це правильно і як це зробити?


Вам потрібно очистити файл або просто повернути його?
ewwhite

Яка програма? Програма має надати підтримку, щоб зробити це належним чином. (Інакше ви можете зробити дуже потворну річ - приєднати до процесу, відкрити новий файл, dup2новий дескриптор над старим, а потім закрити новий дескриптор.)
Девід Шварц

Цікавий підхід Шварца. Мені цікаво бачити, що в дії, і буду грати з ним деякий час. У будь-якому разі, додаток знаходиться в будинку, і я шукаю більш загальне рішення. Мені подобається відповідь kormoc btw
Бруно Полако

@ewwhite Мені потрібно обертати це, я не можу дозволити собі втратити дані журналу
Бруно Полако,

Відповіді:


11

Напишіть logrotateконфігурацію для використанняcopytruncate

copytruncate
    Truncate the original log file in place after creating a copy, instead of moving the 
    old log file and optionally creating a new one. It can be used when some program
    cannot be told to close its logfile and thus might continue writing (appending) to
    the previous log file forever. Note that there is a very small time slice between
    copying the file and truncating it, so some logging data might be lost. When this
    option is used, the create option will have no effect, as the old log file stays
    in place.

Цікаво, що обрізання файлу після копіювання здається досить розумним, навіть з запасом втрати даних. Я не помітив цього варіанту на логротаті. Thx для прозріння :)
Бруно Полако

1

Більшість таких програм реагує на сигнал, такий як SIGHUP, та закриє та знову відкриє свої файли журналу після отримання сигналу. Перевірте документацію вашої програми щодо правильності надсилання сигналу.


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