Перетворення файлу журналу у своєрідний круговий буфер


22

Люди, чи є рішення * nix, яке б змусило файл журналу виконувати функцію кругового буфера? Наприклад, я хотів би, щоб файли журналів зберігали максимум 1 Гбіт даних та відкидали старі записи, як тільки буде досягнуто обмеження.

Це взагалі можливо? Я вважаю, щоб досягти того, щоб файл журналу перетворився на якийсь спеціальний пристрій ...

PS Я знаю про різні інструменти, що логротують, але це не те, що мені потрібно. Логратування вимагає великої кількості вводу-виводу, як правило, один раз на день, тоді як мені потрібне рішення для виконання.


3
Я не впевнений, чому ви вважаєте, що обертання журналу потребує багато вводу. Обертання 10 журналів - це 10 операцій з перейменуванням і HUP служби. Не зовсім вбивча операція ... І це стандартне рішення вашої проблеми :)
pehrs

2
Можливо, працює сценарій / виконуваний файл, який не грає добре з HUP.
Скотт

1
Це забезпечить ще один випадок використання вашого питання. У мене демонізований музичний плеєр. Я хочу журнал довжиною всього кілька рядків, щоб я міг бачити, що грає, і що грав до цього. A tail -f somefileзробив би це. Я просто спробував з обернутими журналами і tail -fне працює з ними.
Ворак

Відповіді:


14

У Linux є кільцевий буфер ядра. Ви можете використовувати його dmesgдля відображення .

Або ось модуль ядра Linux, який, як видається, робить те, що ви хочете.

Що таке емлог?

emlog - це модуль ядра Linux, який дозволяє легко отримати доступ до останнього (і лише останнього) виводу з процесу. Він працює так само, як "хвост -f" у файлі журналу, за винятком того, що необхідне зберігання ніколи не зростає. Це може бути корисно у вбудованих системах, де не вистачає пам’яті чи дискового простору для зберігання повних файлів журналу, але іноді потрібні останні повідомлення про налагодження (наприклад, після того, як спостерігається помилка).

Модуль ядра emlog реалізує простий драйвер пристрою символів. Драйвер діє як названа труба, яка має кінцевий круговий буфер. Розмір буфера легко настроюється. Оскільки більше даних записується в буфер, найдавніші дані відкидаються. Процес, який читає з пристрою emlog, спочатку зчитує наявний буфер, а потім побачить новий текст, як він написаний, аналогічно моніторингу файлу журналу за допомогою "tail -f". (Підтримуються також неблокуючі читання, якщо процес потребує отримання поточного вмісту журналу без блокування, щоб чекати нових даних.)


1
Дякуємо за посилання! До речі, на домашній сторінці emlog є посилання на ulogbufd, що, мабуть, є для мене навіть більш підходящим рішенням.
почанка

Emlog модуль ядра тепер підтримується на GitHub: github.com/nicupavel/emlog
dbernard

4

Найближче, що я можу придумати, - це RRDTools, але, ймовірно, це не те, що ви шукаєте. Іншим рішенням буде моніторинг файлу журналу (скажімо, щосекунди або в Linux з inotify), наприклад, ви пишете сценарій на зразок:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

з прищепленням:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

+1 для згадування RRDtool, реального прикладу реєстрації структури кільцевих даних.
Cory J

Дякуємо, наприклад, що показали використання команди команд оболонки
inotifywait

4

Можна використовувати мультилог із Daemontools djb. Ви труба ваш вихід журналу в нього. Так, це обертання журналу, але обертання просто:

ln current $tai64nlocaltimestamp

Що майже на будь-якій сучасній файловій системі Linux - це дуже швидка операція. Ви можете вказати, скільки файлів журналу ви хочете, наскільки великі ви хочете їх. створіть 10 x 1024mb файлів, і ви будете мати 1Gb кільцевий буфер.

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


Дякую за пораду! Напевно, я також матиму мультилог.
pachanga

1

Ви можете зробити FIFO трубу, а потім прочитати її за допомогою сценарію, який вставляється в базу даних. Коли лічильник досягне 1000, перезапустіть ідентифікаційний номер, що вставляється в базу даних. Зрозуміло, не вдасться зробити розмір, але ви використали це як приклад, тому я припускаю, що це теоретичне питання.


1

Цікаве запитання; ти зазвичай не сприймаєш це як дизайн. У мене є програма, яка використовує мало схожу техніку для запису історії, але вона використовує двійковий формат. Файл журналу складається з чотирьох частин, усі вони викладені в нейтральному для машини форматі:

  1. Заголовок, що містить магічне число та (максимальну) кількість записів у використаному списку та вільному списку, порядковий номер наступного запису історії, фактичну кількість записів у використаному списку, фактичну кількість записів у вільному списку , і довжина файлу (кожен з яких - 4 байти).
  2. Список, що використовується, кожен запис дає зміщення та довжину (4 байти для кожної частини кожного запису).
  3. Безкоштовний список, кожен запис аналогічний використаному списку.
  4. Основні дані, кожен запис історії складається з суміжного набору байтів, що закінчуються нульовим байтом термінатора.

Коли виділяється нова запис, якщо у вільному списку є пробіл, вона перезаписує запис (не обов’язково використовуючи його весь - у цьому випадку фрагмент залишається у вільному списку). Коли у вільному списку немає місця, то в кінці виділяється новий пробіл. Коли старий запис обертається, його простір переміщується у вільний список і поєднується з будь-якими суміжними вільними записами. Він призначений для обробки операторів SQL, щоб записи могли бути розповсюджені по багатьох рядках. Цей код працює на певній кількості записів. Він не обмежує розмір файлу сам по собі (хоча зробити це не важко).

Основний код історії коду є у двох файлах, history.c та history.h, доступних у джерелі для програми SQLCMD (моя версія, а не Microsoft; моя існувала за десять років і більше до Microsoft), яку можна завантажити з архіву програмного забезпечення Міжнародної групи користувачів Informix . Існує також програма демпінгу файлів історії (histdump.c) та тестер історії (histtest.ec - він стверджує, що це ESQL / C, але сам по собі справді код C; одна з функцій підтримки, яку він викликає, використовує деякі Informix ESQL / C функції бібліотеки). Зверніться до мене, якщо ви хочете експериментувати без використання Informix ESQL / C - дивіться мій профіль. Існує кілька дрібницьких змін, щоб зробити його для компіляції histtest поза його дизайнерською середовищем, плюс вам потрібен makefile.


0

Я згоден з коментарем pehrs до вашого запитання. Обертання журналу не так вже й важке. Ви можете налаштувати логротат або інший сценарій, щоб періодично перевіряти файл журналу, навіть так часто, як щохвилини, якщо цього хочете. Коли він виявить, що ваш файл досягає розміру 1 Гб, він просто виконує перейменування, яке займає поруч із відсутністю вводу-виводу. Під час перейменування процес продовжує записувати файл журналу. Ротатор журналу може потім надіслати HUP вашому демону syslog (ваш демон входить через syslog, правда? Якщо ні, він повинен підтримувати сигнал HUP, якщо він добре написаний ...), щоб він знову відкрив вихідний шлях до файлу . У цей момент він почне записувати новий файл у вихідний шлях, і ви можете видалити повернуту версію.

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