LINUX.ORG.RU

как запоминать обработанный кусок лога squid'а


0

1

Изобретаю свой велосипед по анализу лога squid'а. Встал вопрос, как отслеживать последнюю обработанную строку.

Как вариант думаю сохранять первую и последнюю временную отметку из лога, на момент обработки. Но если так делать, то через некоторое время появляется большое число таких временных отрезков, которые будут тормозить обработку лога, если сравнивать каждую новую временную отметку лога с ними. Да и поиск последней обработанной записи в таком случае замедляется, в большом логе. Может есть какой то другой более правильный и рациональный способ?!

Заранее спасибо.

★★★★★

Я тоже писал подобное. Для увеличения скорости применял простейшее индексирование (т.е. нужно вам, допустим, перейти к моменту T, ищете ближайший в индексе и делаете lseek на нужное расстояние).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cyclon

А вот logrotate лучше для логов squid'а отключить. Иначе данные за пару-тройку месяцев назад уже не найдете...

Eddy_Em ☆☆☆☆☆
()

номер строки запоминай

А вообще для анализа логов удобно их загонять в sqlite3, а потом уж можно извращаться с sql запросами как угодно.

у меня так условно: tailf access.log | squid2sqlite.pl $DATE.sqlite.db

sdio ★★★★★
()
Ответ на: комментарий от sdio

По номеру строки то же сложно, а если файл поменяется. Если смотреть изменение размера, то где гарантия что новый файл не окажется больше запомненного размера старого, в итоге начало файла будет пропущено. Загонять в базу я и так планирую :)

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Да откройте вы мои исходники, там немного.

Я сделал структуру {time, offset}, которую и сохранял в файле. Индексировал через определенный промежуток времени: т.е. парсер в первый проход прогонял лог, и с определенным шагом по времени сохранял эти структуры в файл. При дальнейших вызовах происходит считывание индексного файла на предмет поиска нужного времени, открывается лог, делается lseek на нужную позицию и происходит дальнейшая обработка.

По мере разрастания файла очередные запуски программки добавляют нужные данные в индексный файл.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cyclon

ты плохо описал ситуацию.

как запомнить позицию тебе дали несколько вариантов, а файл лога сам не меняется (не должен).

либо ты в онлайне читаешь и анализируешь лог (tailf access.log | ...) либо после ротации работаешь с файлом в «оффлайн» (файл закрыт на запись и меняться не может)

sdio ★★★★★
()
Ответ на: комментарий от sdio

Отнюдь: файл может расти, на работу «парсилки» это не повлияет. Главное, чтобы logrotate «макушку» не отрезал.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

пардоню :) мельком пробежал, сходу не понял

cyclon ★★★★★
() автор топика

cp /var/log/squid.log /var/cache/parser/squid.log && echo > /var/log/squid.log && megaparser /var/cache/parser/squid.log && rm /var/cache/parser/squid.log

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

но луче так:

/etc/init.d/squid stop && \
mv /var/log/squid.log /var/cache/parser/squid.log && \
touch > /var/log/squid.log && \
/etc/init.d/squid start && \
megaparser /var/cache/parser/squid.log && \
rm /var/cache/parser/squid.log && \
echo "PROFIT" || echo "Epic Fail"

Jetty ★★★★★
()

Блин, ну патчите сквид(исходники же доступны), чтобы наравне с логом он писал в базу и все, делов-то. Весь анализ тогда сведется к ограниченному набору SELECT-ов.

ef37 ★★
()

>думаю сохранять первую и последнюю временную отметку

Зачем первую? Парсинг с начала файла же? Запоминайте смещение и содержимое последней стороки. При продолжении проверяете совпадение. Если совпало, значит файл тот же, и продолжаем парсинг. Если не совпало, значит файл сротировался и надо смотреть другой файл, а этот парсить с начала.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.