2012-02-07 100 views
1

我正在設計一個守護進程,它將連續讀取單個文本文件中的行並處理這些行。在守護進程沒有運行的情況下,在線路被寫入文本文件的情況下,跟蹤最後一行處理的通用方法是什麼,與文件名無關?跟蹤文本文件中最後一行的最佳方式

每隔一段時間,文件就會被歸檔並在其位置創建一個新的空白文件。守護進程將停止進行歸檔。

我的第一個想法似乎過於複雜,它是計算並存儲上次成功處理的記錄的散列和行號。然後,當守護進程再次啓動時,運行該行號並計算散列值。如果哈希匹配,繼續處理下一條記錄。如果哈希不匹配,請從頭文件開始,因爲那會說這是一個新文件。

我有一種感覺,有一個很好的通用目的技術使用的日誌文件分析器或在我沒有接觸到的教科書中的東西。

回答

0

假設您擁有足夠的磁盤空間並假設您安全地終止守護進程... 只需將最後一行處理寫入文件(關閉守護進程後)即可。

如果你想

從contextlib進口contextmanager

http://docs.python.org/library/contextlib.html

class a_daemon(): 
    def __init__(self,last_line): 
     print "initilizing.." 
     self.last_line=last_line 

    def run_me(self): 
     print "running.." 
     #while true, process lines, set last_line to current line being processesed. 
     self.last_line='blah' 

from contextlib import contextmanager 

@contextmanager 
def run_new_daemon(): 
    print "getting last line" 
    last_line=open("last_line.txt").read() #you should get a "file does not exist" error the first time running this unless you created the file already 

    my_daemon=a_daemon(last_line) 
    yield my_daemon 

    print "shutting down, writing last line to file." 
    with open("last_line.txt",'w') as last_line_file: 
     last_line_file.write(my_daemon.last_line) 

with run_new_daemon() as my_daemon: 
    my_daemon.run_me() 
+0

我不敢相信我只是想在存儲行之前對它進行哈希處理。非常簡單。不過,我對上下文管理的想法很好奇。上下文管理器將被用來做什麼?我還沒有真正使用過其中之一。 – Jeremy 2012-02-07 03:19:46

+0

我添加了一些示例代碼,但是我並不特別喜歡我的解決方案。希望您確實發現上下文管理的示例有趣。 – 2012-02-07 05:39:00

0

如果您不費吹灰之力存儲散列,那麼您可能會存儲整行。它不會那麼長。或者無論如何,如果它足夠長是一個問題,那麼這些必須是非常大的文件!

無論如何,你需要某種數據持久性。 Pickle,JSON,SQLite都是可選的,但在這種情況下它們看起來都是過分的。我只是將它存儲在一個文件中。

0

我會用更簡單的方法,你可以換一個背景下馬槽裏的守護進程的每個實例。保存當前文件位置和創建時間。如果創建時間增加,則它是一個新文件。否則從保存的位置開始。

假定只添加行或替換文件。

更偏執的策略是將整個文件散列到保存的偏移量以查看它是否發生了變化。

+0

文件創建時間是我想到的第一件事,但是我的理解是linux文件系統(本例中爲ext4)不會保存文件的創建時間? – Jeremy 2012-02-07 03:22:28