Форум сайта python.su
0
Всем привет. Есть лог, который все время пишется, и при достижении определенного размера, начинает писаться заново (с нуля). Написала обработчик данного лога, который в динамике ищет фразы по шаблону и инсертит их. Проблема, как раз в моменте перезапуска лога. Подходящих решений не нашла, может кто сталкивался?
import os, time import datetime import re import cx_Oracle def tail(fileone): fileone.seek(0,2) while True: line = fileone.readline() if not line: time.sleep(0.1) continue yield line files = [] listing = [] con = cx_Oracle.connect('user/pass@127.0.0.1/mybase') cur = con.cursor() pat = r'MASK' fileone = open('C:/My.log') logStr = tail(fileone) for line in logStr: if 'mask1' in line: regular = re.search(pat, line) s = regular.group(2) example = [( s, datetime.datetime.now())] print example cur.executemany (""" insert into table(id, sys_creation_date) values (:1, :2) """, example) con.commit() fileone.close() cur.close() con.close()
Офлайн
221
Можете проверять текущую позицию “курсора” в файле с помощью метода tell(), в случае если файл перезаписывается сначала то поцизия будет меньше чем была ранее (в общем случае не 100% вариант конечно, но в данном случае так) и значит можно сместиться в начало файла seek(0) и продолжить выполнение цикла.
Все это в том случае если файл не был пересоздан т.е. не менялся файловый дескриптор, а перезаписывалось именно содержимое файла. В противном случае видимо надо переоткрывать файл.
Офлайн
88
Надёжнее всего перехватывать события изменения в ФС.
Посмотрите на
https://pypi.python.org/pypi/infi.watchdog
https://github.com/shaurz/fsmonitor
и подобные.
Офлайн
253
Вообще нормальный логгер обычно начинает новый файл, после записи N файлов начинает их писать с первого. или удаляет старые файлы. В этом случае слежка за позицией в файле не нужна. Правильное решение переконфигурировать логгер так чтобы он стал писать в более удобной для вас форме.
Офлайн
221
doza_and
ну это же далеко не всегда возможно :-(. Поэтому слишком часто приходится задачи решать именно по факту.
Офлайн
253
JOHN_16Согласен, жизнь далека от идеала…
ну это же далеко не всегда возможно
Офлайн