我正在与一个气质的网络应用程序,我不打算命名。它会不时遇到问题,并且一旦出现问题,它会将堆栈跟踪和错误消息写入exception.log
文件。我想及时了解这些问题,所以我有一个可以定期扫描日志的Python脚本(对于cron来说是很好的)。如果exception.log的大小大于零,脚本会将文件内容转储到我的电子邮件中,然后将它们移动到exception_archive.log
。我现在的策略是在文件中读取,发送电子邮件,并在必要时写入例外存档,如果这两方面的措施是成功的,只是如何在执行Python脚本期间检测文本文件的更改?
target = open(target_log, 'w')
target.close()
到zorch原始日志。但是,由于我无法预测系统何时写入exception.log
,脚本中至少有一处可能会丢失数据 - 在我读取现有数据并决定覆盖之后,系统可能会向日志中写入内容文件。另外,我从痛苦的经历中学到,如果exception.log
不存在,气质的网络应用程序将不会重新创建它 - 它只会将异常数据放在地板上。因此,“重命名并重新创建日志文件”这个天真的解决方案只会将问题推向一层。
问题的核心是:如何将数据从一个文本文件转移到另一个文本文件,以使新数据写入文件的同时我的脚本正在执行,那么丢失该数据的概率为零或极小?我怀疑这是一个难题,或者是我刚刚没有听到解决方案的解决问题。我无法扩展应用程序本身 - 管理层对修补程序非常怀疑,加上它不在Python中,所以我必须从头开始。
其他方面:
[[email protected] ~]$ 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
[[email protected] ~]$ 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
它的眉头,共享主机,这就是为什么我把它的一部分运行的“气质”。我也称在2011年运行Python 2.3更糟糕的事情。如果我有一个现代Python可以使用,这可能会更容易。
我会去与下面凯文的答案的变化 - 因为我控制crontab中,我将有脚本寻找任何在正确的时间戳记范围上进行操作。这有一个好处,即相关信息可以全部存放在Python脚本中,并成为单一的真实来源。
@'newData = file.read()'和'lastKnownSizeOfFile = size(file)'之间有一段时间。如果在这段时间内写了什么会发生什么? – ovgolovin
优秀的点。我将修改我的伪代码以避免这种情况。 – Kevin
如果在将文件写入文件的过程中调用'size(file)',该怎么办?所以这条线将被连续分成两封电子邮件。 – ovgolovin