2013-07-23 66 views
3

我想打印與在Ubuntu中創建的日誌消息的USB相關的行。這裏是我的代碼:在Python中閱讀和打印與USB有關的變種日誌消息

>>> import re 
>>> fd = open("/var/log/syslog.1", "r") 
>>> for lines in fd: 
...  if re.match("usb", lines): 
...    print lines 

(順便說一句,我不知道,如果該文件syslog.1是正確的。然而,我發現很多在它的消息和一些相關的USB)

回答

1

對於最近的消息,您想要/var/log/syslog - /var/log/syslog.1基本上是舊消息的備份。

事情停止工作,從你的代碼是,你正在使用re.match()代替re.search() - 你可以從文檔在這些鏈接看,re.match()只有被搜索的文本的開頭相匹配。

實際上,您根本不需要使用正則表達式。這裏是你的代碼的替代:

>>> with open("/var/log/syslog") as f: 
...  for line in f: 
...   if "usb" in line.lower(): 
...    print line 
... 

有幾件事情是不同的位置:

  1. 我們正在使用with context manager打開該文件。這有助於Python清理並關閉文件,即使出現問題,這也是一個很好的習慣。

  2. 與Python中的常規方式一樣,我們調用文件變量ffd會讓有人讀你的代碼,認爲你在說的是file descriptor,這是不一樣的。

  3. 由於它包含一行,我們將調用字符串變量line而不是lines

  4. ,而不是一個正則表達式,我們就可以檢查"usb"是否在某處線(我們正在轉換線檢查之前降低的情況下,這樣我們就在原來趕上"USB"了。

+0

非常感謝你這麼詳細的解釋零!起初,我在看系統日誌,但在更新之後,它沒有與usb相關的信息。所以我決定去用syslog.1文件 – SidNoob

+1

@SidNoob沒問題:-)如果你準備做一些額外的工作,你可以使用['glob'](http://docs.python.org/2 /library/glob.html)和['gzip'](http://docs.python.org/2/library/gzip.html)模塊來搜索「syslog.1」,「syslog.2.gz」等。你的代碼中的文件也是如此。 –

3

@SidNoob:添加到日誌的主題(可能不是python相關的),我假設你正在尋找來自USB守護進程或驅動程序的日誌。如果是這種情況,你可能正在尋找正確的日誌文件「/ var/log/syslog「記錄內核相關的消息(包括驅動程序),如果它是一個應用程序(具有不同的日誌級別),那麼你可能需要查看」/ var/logs/messages「

但是到了POINT:有時候打開一個像「/ var/log/syslog」這樣的文件進行讀取可能會佔用大量內存,因爲您正在將文件加載到RAM中。在服務器類型的環境中,這可能會長到MB或甚至更長。有一個命令「dmesg」,不管var/log/syslog文件的內容是什麼,它都會輸出到標準輸出中,因此,不用打開這個大文件,也可以將「dmesg」的輸出存儲到一個字符串中,你可能會認爲這兩種方式都是相同的,並且可能在運行python程序時佔用相同的內存。是的,但是如果你清除了「dmesg」輸出,那麼不會。「dmesg」是一個因此您可以在運行usb應用程序之前使用「dmesg -c」將其清除,並在啓動應用程序之後發出「dmesg」,這樣可以減少解析的行數,從而加快程序的速度。

希望這會增加您的知識和程序。