Страниц: [1]
  Печать  
Автор Тема: Алгоритм параллельной записи инфы в лог и удаления первых n байт  (Прочитано 7035 раз)
pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« : Января 30, 2011, 06:50:42 pm »

Доброго Вам времени суток!
Задача такая. Есть логгер, который написан под несколько платформ(поэтому просто использовать syslog вместо него пока не получится). Всё работает корректно кроме одного - размер файла лога не отслеживается:( Логер использует функции fopen, fprintf, fclose fflush и т.д. Логично было бы решить данную проблему стиранием n байт из начала файла при общем объеме жесткого диска меньше m, но ведь доступ к текстовому файлу возможен только последовательно сначала вконец. Какие есть алгоритмы решения данной задачи? Записывать несколько лог файлов и потом часть из них стирать не подойдет - придется существенно править программу чтения журнала ошибок:(
Желательно чтобы данный алгоритм легко переносился на другие платформы.
Записан
oder
Гость
« Ответ #1 : Января 30, 2011, 08:29:57 pm »

Файл - это не текст, записанный карандашом на бумаге. Из него не получится вытереть первых n символов. Кроме как регулярно начинать новый файл и удалять старые - другого выхода нет.
Записан
AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #2 : Января 30, 2011, 09:38:31 pm »

В рамках простого текстового файла эту задачу не решить.
Издревле люди решали, нерешаемые в рамках простых структур, задачи путем создания сложных структур. Smiley

Я бы сделал что-то типа файловой системы внутри файла фиксированного размера.
Например:
Создаем файл и размечаем его на структуры трех типов фиксированного размера - заголовок файла, таблица индексов и таблица строк.
С заголовком все понятно. Таблица строк - массив буферов фиксированного размера (предположим 80 байт), каждый из которых будет содержать одну строку протокола (можно даже каждую строку по отдельности компрессировать при желании). Таблица индексов - массив блоков метаинформации для каждой строки из таблица строк (один к одному).
Соответственно, алгоритм добавления записи в лог выглядит так:
1. открываем файл.
2. проверяем есть ли пусты строки (для этого надо просто пробежать по таблице индексов). Если есть занимаем один или несколько буферов из таблицы строк.
3. если нет пустых, то ищем самый старый буфер и занимаем его.
С алгоритмом чтения все понятно и так:
1. открываем.
2. сортируем индексы по времени.
3. выводим на экран.

Ну или, как написал oder, делаем ротацию файлов протокола...
Записан

oder
Гость
« Ответ #3 : Января 30, 2011, 11:47:10 pm »

Андрей, логирование - операция далеко не главная по необходимости и её основное достоинство - скорость и незаметность с точки зрения общей производительности программы. Поэтому все навороченные структуры и алгоритмы сразу идут лесом. Если для того, чтоб записать лог надо
1) seek-нуться на таблицу индексов
2) записать в неё запись
3) seek-нуться на таблицу строк
4) записать строку
то тут уже не о чем говорить. Я уже молчу, что если запись в лог не атомарная сразу полезут проблемы с испорченной внутренней структурой при аварийном завершении.
« Последнее редактирование: Января 30, 2011, 11:49:00 pm от oder » Записан
AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #4 : Января 31, 2011, 09:22:23 am »

Все зависит от приоритетов. Есть случаи когда протоколирование очень важно.
Записан

dmi
QOR.Admin
*****
Offline Offline

Сообщений: 469



Просмотр профиля
« Ответ #5 : Февраля 04, 2011, 11:58:30 am »

Есть замечательное решение logrotate.
Логи автоматически обрезаются и пакуются. Если нужно, можно настроить всё что угодно - отправку по почте, закачиваение на ftp/ssh, стирание старых.

Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #6 : Февраля 05, 2011, 05:59:58 pm »

Цитировать
...размер файла лога не отслеживается
Ну так:
А почему нельзя отслеживать/контролировать размер файла лога?

Цитировать
Логично было бы решить данную проблему стиранием n байт из начала файла при общем объеме жесткого диска меньше m, но ведь доступ к текстовому файлу возможен только последовательно сначала вконец. Какие есть алгоритмы решения данной задачи? Записывать несколько лог файлов и потом часть из них стирать не подойдет - придется существенно править программу чтения журнала ошибок:(
1) Ни разу не логично. Мне кажется при таком "логичном" подходе Вам темболее прийдется править программу чтения журнала.
2) Кто мешает, без вмешательства в код "чтения журнала", написать модуль который на базе "кусочных" логов сформирует привычный для этого ПО цельный лог?
3) Раз уж вы решились на то чтобы удалять какието старые байты  из лога в пользу новых байтов - ну так сикните в начало лога и переписывайте файл сначала (для текстовых логов, при определенном подходе/форматировании это еще допустимо). Правда если Ваши логи содержат бинарные данные (фиг знает что и как Вы там логируете) - то тут Вам успехов пожелаю только (налицо проблемы с местом на диске, при этом очистка логов решает проблему с местом, а Вы в добавок желаетет не упаковывать логи/делить на части/удалять по степени/времени важности - а оперировать байтами текущего боевого лога, рискуя потерять все сразу)
Записан
pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« Ответ #7 : Февраля 11, 2011, 02:58:23 pm »

Есть замечательное решение logrotate.
Логи автоматически обрезаются и пакуются. Если нужно, можно настроить всё что угодно - отправку по почте, закачиваение на ftp/ssh, стирание старых.

А у тебя нету бинарей logrotate случайно? А то пол дня из сырцов пытаюсь собрать - ничего не получается:(
У меня QNX 6.3.2 но возможно будут работать и с более поздней версии.
Записан
lesav
Sr. Member
****
Offline Offline

Сообщений: 262



Просмотр профиля
« Ответ #8 : Февраля 11, 2011, 10:30:24 pm »

А logrotate shell script не пойдет ?
Записан

pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« Ответ #9 : Февраля 12, 2011, 02:10:52 am »

А какой именно? Чего-то подходящего не могу найти.
Записан
pavel123__
Full Member
***
Offline Offline

Сообщений: 139


Просмотр профиля
« Ответ #10 : Февраля 12, 2011, 03:36:00 pm »

С горем пополам установил gnu rottlog. У кого-нибудь есть пример его настройки?
Записан
Страниц: [1]
  Печать  
 
Перейти в: