Как я могу обнаружить изменения в текстовом файле во время выполнения скрипта Python? - PullRequest
4 голосов
/ 12 октября 2011

Я работаю с темпераментным веб-приложением, которое я не собираюсь называть.Время от времени он сталкивается с проблемами, и когда это происходит, он записывает следы стека и сообщения об ошибках в файл exception.log.Я хочу знать об этих проблемах своевременно, поэтому у меня есть скрипт на Python, который регулярно просматривает журнал (ура для cron).Если размер исключения.log больше нуля, сценарий выгружает содержимое файла в электронное письмо, а затем перемещает его в exception_archive.log.Моя текущая тактика заключается в чтении файла, отправке электронной почты и записи в архив исключений, если необходимо, и, если оба эти шага были успешными, просто наберите

target = open(target_log, 'w')
target.close()

, чтобы сжать исходный журнал.Однако, поскольку я не могу предсказать, когда система запишет в exception.log, в сценарии есть по крайней мере одна точка, в которой я могу потерять данные - система может что-то записать в журнал после того, как я прочитал существующие данные и решилперезаписать файл.Кроме того, из мучительного опыта я узнал, что если exception.log не существует, то темпераментное веб-приложение не будет его воссоздавать - оно просто удалит данные об исключениях на пол.Таким образом, наивное решение «переименовать и заново создать файл журнала» только толкает проблему вниз на уровень.

Суть вопроса в следующем: Как я могу (перенести | переместить |чтение-запись-стирание) данных из одного текстового файла в другой таким образом, что если новые данные записываются в файл во время выполнения моего сценария, существует нулевая или минимальная вероятность потери этих данных? Я подозреваю, что этоэто либо сложная проблема, либо решенная проблема, решение которой я просто не слышал.Я также не могу расширять само приложение - руководство очень скептически относится к нему, плюс оно не в Python, поэтому мне придется начинать с нуля.

Дополнительный контекст:

[me@server ~]$ uname -a
Linux server.example.com 2.6.9-101.ELsmp
#1 SMP Thu Jul 21 17:28:56 EDT 2011 i686 i686 i386 GNU/Linux
[me@server ~]$ python 
Python 2.3.4 (#1, May  5 2011, 17:13:16) 
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2

Он работает на грубом виртуальном хостинге, поэтому я называю его "темпераментным".Я также называю это худшими вещами для запуска Python 2.3 в 2011 году. Вероятно, было бы проще, если бы у меня был современный Python для работы.


Я собираюсь перейти с вариантом ответа Кевина ниже- так как я контролирую crontab, я собираюсь заставить скрипт найти что-нибудь в нужном диапазоне временных отметок и оперировать этим.Это имеет побочное преимущество: вся соответствующая информация может находиться в скрипте Python и быть единственным источником правды.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

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

#lastKnownSizeOfFile is saved somewhere so it persists between executions of this script
if size(file) > lastKnownSizeOfFile: #found an update!
    amountToRead = size(file) - lastKnownSizeOfFile
    file.seek(lastKnownSizeOfFile)
    newData = file.read(amountToRead)
    exceptionArchive.write(newData)
    emailMe(newData)
    lastKnownSizeOfFile += amountToRead

Если вы обеспокоены тем, что при этом файл журнала станет слишком большим, периодически удаляйте его в часы низкой активности (например, 2 часа ночи),когда маловероятно, что приложение будет что-либо записывать в него.

1 голос
/ 12 октября 2011

Переименуйте exception.log во временное имя файла, затем обработайте временный файл. (Я предполагаю, что « темпераментное веб-приложение » просто воссоздает exception.log, если его не существует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...