2011-10-12 78 views
4

我正在与一个气质的网络应用程序,我不打算命名。它会不时遇到问题,并且一旦出现问题,它会将堆栈跟踪和错误消息写入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脚本中,并成为单一的真实来源。

回答

2

我会避免在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点)定期删除它,当它是不太可能的应用程序将被写任何东西给它。

+0

@'newData = file.read()'和'lastKnownSizeOfFile = size(file)'之间有一段时间。如果在这段时间内写了什么会发生什么? – ovgolovin

+0

优秀的点。我将修改我的伪代码以避免这种情况。 – Kevin

+0

如果在将文件写入文件的过程中调用'size(file)',该怎么办?所以这条线将被连续分成两封电子邮件。 – ovgolovin

1

exception.log重命名为临时文件名,然后处理临时文件。 (我假设“气质的网络应用程序”将简单地重新创建exception.log,如果它不存在)。

+2

可以在文件被其他应用程序使用时删除文件吗? – ovgolovin

+0

我从痛苦的经历中学到,TWA不会重新创建exception.log,它只会将异常数据放在地板上。所以问题依然存在。真的希望它不是一直乌龟。 –

相关问题