如何在执行Python脚本期间检测对文本文件的更改?
我正在使用一个喜怒无常的web应用程序,我不打算命名它。它有时会遇到问题,当遇到问题时,它会将堆栈跟踪和错误消息写入如何在执行Python脚本期间检测对文本文件的更改?,python,logging,file-io,Python,Logging,File Io,我正在使用一个喜怒无常的web应用程序,我不打算命名它。它有时会遇到问题,当遇到问题时,它会将堆栈跟踪和错误消息写入exception.log文件。我想及时了解这些问题,所以我有一个定期扫描日志的Python脚本(hooray for cron)。如果exception.log的大小大于零,脚本会将文件内容转储到给我的电子邮件中,然后将其移动到exception\u archive.log。我目前的策略是读取文件,发送电子邮件并在必要时写入异常存档,如果这两个步骤都成功,只需 target =
exception.log
文件。我想及时了解这些问题,所以我有一个定期扫描日志的Python脚本(hooray for cron)。如果exception.log的大小大于零,脚本会将文件内容转储到给我的电子邮件中,然后将其移动到exception\u archive.log
。我目前的策略是读取文件,发送电子邮件并在必要时写入异常存档,如果这两个步骤都成功,只需
target = open(target_log, 'w')
target.close()
对原始日志进行搜索。但是,由于我无法预测系统何时将写入
exception.log
,因此脚本中至少有一点可能会丢失数据-在我读取现有数据并决定覆盖该文件后,系统可能会向日志写入某些内容。此外,我从痛苦的经历中了解到,如果exception.log
不存在,喜怒无常的web应用程序将不会重新创建它——它只会将异常数据扔到地板上。因此,“重命名并重新创建日志文件”这一天真的解决方案只会将问题推到一个层面
因此,问题的核心是:如何将数据从一个文本文件传输到另一个文本文件,从而在脚本执行时将新数据写入该文件,则丢失该数据的可能性为零或最小?我怀疑这是一个难题,或者是一个解决了的问题,我只是没有听到解决方法。我也不能扩展应用程序本身——管理层对修补它非常怀疑,而且它不是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年运行Python2.3的更糟糕的事情。如果我可以使用现代Python,这可能会更容易
我将使用下面Kevin答案的一个变体-因为我控制crontab,所以我将让脚本查找正确时间戳范围内的任何内容并对其进行操作。这样做的另一个好处是,相关信息都可以存在于Python脚本中,并且是唯一的真实来源 将
exception.log
重命名为临时文件名,然后处理临时文件。(我假设“气质web应用程序”只需重新创建异常.log(如果它不存在)。我会避免在web应用程序仍在运行时删除异常日志。只需扫描日志进行更新,无需进行任何更改
#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点)定期删除它,此时应用程序不太可能向其写入任何内容。@在newData=file.read()
和lastKnownsizeFile=size(file)
之间有一段时间。如果在这段时间内写了一些东西会发生什么?很好。我将修改我的伪代码以避免这种情况。如果在写入文件的中间调用“代码>大小(文件)< /代码>,会发生什么?因此,这一行将被划分为两封连续的电子邮件。顺便问一下,我只是想知道,这个问题没有任何标准的解决方案吗?例如数据库或Windows注册表文件,大量应用程序同时访问这些文件进行读写,一切正常。@ovgolovin,我认为除了在检查日志时强制web应用程序睡眠外,没有任何解决方案。在任何情况下,都不会永久丢失任何数据(它只是被拆分为多封电子邮件),因此OP可能已经足够了。当文件被其他应用程序使用时,是否可以删除该文件?我从痛苦的经历中了解到,TWA不会重新创建exception.log,它只会将异常数据放在地板上。因此,问题依然存在。真的希望不是乌龟一路下来。