Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在执行Python脚本期间检测对文本文件的更改?_Python_Logging_File Io - Fatal编程技术网

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

如何在执行Python脚本期间检测对文本文件的更改?,python,logging,file-io,Python,Logging,File Io,我正在使用一个喜怒无常的web应用程序,我不打算命名它。它有时会遇到问题,当遇到问题时,它会将堆栈跟踪和错误消息写入exception.log文件。我想及时了解这些问题,所以我有一个定期扫描日志的Python脚本(hooray for cron)。如果exception.log的大小大于零,脚本会将文件内容转储到给我的电子邮件中,然后将其移动到exception\u archive.log。我目前的策略是读取文件,发送电子邮件并在必要时写入异常存档,如果这两个步骤都成功,只需 target =

我正在使用一个喜怒无常的web应用程序,我不打算命名它。它有时会遇到问题,当遇到问题时,它会将堆栈跟踪和错误消息写入
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,它只会将异常数据放在地板上。因此,问题依然存在。真的希望不是乌龟一路下来。