2011-10-12 80 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,它只會將異常數據放在地板上。所以問題依然存在。真的希望它不是一直烏龜。 –

相關問題