Уведомления

Группа в Telegram: @pythonsu

#1 Май 24, 2013 00:19:25

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога "живого" лога

Есть некая программа кототорая работая пишет в лог (конкретно это дебаг лог Firefox-а #export NSPR_LOG_MODULES=nsHttp:3).
Нужно также парсить этот лог в реальном времени - то есть python скрипт парсит лог, через некоторое время опять парсит (но нужно что б не сначала файла лога, а с того места где добавилась новая информация).
Есть также вариант что ту часть лога которую скрипт обработал можно удалить но не знаю как это сделать что б при совместном доступе все работало стабильно (мне так бы было даже лучше так как размер лога не разбухал бы).
Подскажите как лучше реализовать?

Офлайн

#2 Май 24, 2013 02:10:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Парсинг лога "живого" лога

agryn
ну по первому пункту все просто - чиаешь файл лога, запоминаешь размер. В следующий раз смотришь - изменился ли размер, если да то перемешаешься на заранее сохраненную позицию и читаешь кусок лога и тд.
по второму пункту: если плагин держит файл открытым на запись, то у него свой “курсор” внутри файла куда ведется запись. И от того что кто то влезет и изменит содержимое файла этот курсор в последслвии неизветсно где окажется , что вероятно может привести к ошибке или к нежелаемому результату.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Июнь 15, 2013 10:10:24

funnyman
Зарегистрирован: 2012-07-10
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога "живого" лога

можно использовать генераторы, пример из книги “Справочник по Python”:

import time
def tail(f):
    f.seek(0,2)
    while True:
        line = f.readline()
        if not line: 
            time.sleep(0.1)
            continue
        yield line

Пердаем в функцию файловый дескриптор, переходим в конец файла, читаем строку, если строки нет, то приостанавливаемся на некоторое время, тут может выставить задержку примерно равную добавлению новых данных в ваш лог файл. Далее цикл повторяется, если новые данные есть то объект функции генератора будет возвращать например в цикле for каждый раз новую строку.
Например:
f = open('file.log', 'r')
logStr = tail(f)
for line in logStr:
    #парсим то новую строку из лог файла, которая сейчас находится в line

Отредактировано funnyman (Июнь 15, 2013 10:13:52)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version