Я работаю с темпераментным веб-приложением, которое я не собираюсь называть.Время от времени он сталкивается с проблемами, и когда это происходит, он записывает следы стека и сообщения об ошибках в файл 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 и быть единственным источником правды.