2012-06-22 57 views
0

我想在循環中從內核日誌/var/log/messages中讀取最後三行。python從內核日誌中讀取最後三行

for i in xrange(0,100): 
    # do_stuff() 
    file = open('/var/log/messages') 
    lines = file.readlines()[-3:] 
    # analyse_stuff() 
    file.close() 

但我有這個代碼的問題:

[...] 
1013477960613797 1013477960959759 1013477961174602 
1013477960613797 1013477960959759 1013477961174602 
1013477960613797 1013477960959759 1013477961174602 
1013477960613797 1013477960959759 1013477961174602 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477973551967 1013477973773506 1013477977678559 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
1013477986756370 1013477990527612 1013477990834895 
[...] 

正如你所看到的,值被重複多次。 do_stuff()執行一個二進制文件,它發出三條日誌消息。 analyse_stuff()將分析這三條線,並確實 我總是關閉該文件並重新打開它,因爲我認爲這會解決問題,但它不會。任何想法會發生什麼?

+3

[爲什麼不使用tail命令?](http://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with-python-similar-尾部) – m0skit0

+0

我可能會使用'tail',但我更願意直接在python中執行,因爲腳本必須進行一些分析。這只是重要的片段。 – samuirai

+0

檢查activestate上的[tail recipe](http://code.activestate.com/recipes/157035-tail-f-in-python/)。 – georg

回答

4

我通常會使用尾巴,但如果你真的只需要最後的'n'行,並且不關心跟隨(類似於'tail -f'),那麼你最簡單的選擇是像:

from collections import deque 
last3 = deque(open('/path/to/your/file'), 3) 
print last3 

deque將消耗逐行,丟棄最舊的條目,以保持的3行的約束。查看http://docs.python.org/library/collections.html#collections.deque獲取更多信息