我正在使用一款我不会透露姓名的气质网页应用。它会不时遇到问题,当它出现问题时,会将堆栈跟踪和错误消息写入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脚本中,并且是单一的事实来源。
答案 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
(如果不存在)。