如何在执行Python脚本期间检测文本文件的更改?

时间:2011-10-12 17:43:31

标签: python logging file-io

我正在使用一款我不会透露姓名的气质网页应用。它会不时遇到问题,当它出现问题时,会将堆栈跟踪和错误消息写入exception.log文件。我想及时了解这些问题,所以我有一个Python脚本定期扫描日志(对于cron来说很好)。如果exception.log的大小大于零,则脚本会将文件的内容转储到我的电子邮件中,然后将其移至exception_archive.log。我目前的策略是读取文件,发送电子邮件并在必要时写入例外档案,如果这两个步骤都成功,那么

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

来zorch原始日志。但是,由于我无法预测系统何时写入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

它在cruddy共享主机上运行,​​这也是我称之为“气质”的部分原因。我还称2011年运行Python 2.3更糟糕。如果我有一个现代的Python可以使用,这可能会更容易。


我将在下面对Kevin的答案进行修改 - 因为我控制了crontab,我将让脚本在正确的时间戳范围内查找任何内容并对其进行操作。这样做的另一个好处是,相关信息都可以存在于Python脚本中,并且是单一的事实来源。

2 个答案:

答案 0 :(得分:2)

我会避免在网络应用仍在运行时删除异常日志。只需扫描日志即可获取更新,而无需进行任何更改。

#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 :(得分:1)

exception.log重命名为临时文件名,然后处理临时文件。 (我假设“气质网络应用”只会重新创建exception.log(如果不存在)。