[英]Reading and printing var log messages related to USB in Python
我想打印與 Ubuntu 中創建的日志消息的 USB 相關的行。 這是我的代碼:
>>> import re
>>> fd = open("/var/log/syslog.1", "r")
>>> for lines in fd:
... if re.match("usb", lines):
... print lines
(順便說一句,我不確定文件 syslog.1 是否正確。但是,我確實在其中發現了很多消息,其中一些消息與 USB 相關)
@SidNoob:添加到日志主題(可能與 python 無關),我假設您正在尋找來自 USB 守護程序或驅動程序的日志。 如果是這種情況,您可能正在查看正確的日志文件“/var/log/syslog”,該文件記錄了與內核相關的消息(包括驅動程序)。 如果它是一個應用程序(具有不同的日志級別),那么您可能需要查看“/var/logs/messages”。
但重點是:有時打開像“/var/log/syslog”這樣的文件進行讀取可能會占用大量內存,因為您正在將文件加載到 RAM 中。 在服務器類型的環境中,這可能會達到 MB 甚至更長。 無論“var/log/syslog”文件的內容是什么,有一個命令“dmesg”都會打印到標准輸出。因此,除了打開這個大文件之外,您還可以將“dmesg”的輸出存儲到一個字符串中,然后逐行解析。
您可能認為這兩種方式是相同的,並且在運行 python 程序時可能會占用相同的內存。 是的,但如果您清除“dmesg”輸出,則不會。 “dmesg”是一個環形緩沖區,因此您可以在運行 USB 應用程序之前使用“dmesg -c”清除它,並在啟動應用程序后發出“dmesg”。 通過這種方式,您可以減少解析的行數,從而加快程序速度。
希望這會增加您的知識和您的程序。
對於最近的消息,您需要/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
...
這里有一些不同之處:
我們使用with
上下文管理器打開文件。 即使出現問題,這也有助於 Python 清理和關閉文件,這是一個好習慣。
按照 Python 的慣例,我們將文件變量稱為f
。 fd
會讓閱讀你代碼的人認為你在談論文件描述符,這不是一回事。
由於它包含一行,我們將調用字符串變量line
,而不是lines
。
而不是正則表達式,我們可以只檢查"usb"
是否在某處的行中(並且我們在檢查之前將行轉換為小寫,以便我們也能在原始行中捕獲"USB"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.