簡體   English   中英

在 Python 中讀取和打印與 USB 相關的 var 日志消息

[英]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
... 

這里有一些不同之處:

  1. 我們使用with上下文管理器打開文件。 即使出現問題,這也有助於 Python 清理和關閉文件,這是一個好習慣。

  2. 按照 Python 的慣例,我們將文件變量稱為f fd會讓閱讀你代碼的人認為你在談論文件描述符,這不是一回事。

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

  4. 而不是正則表達式,我們可以只檢查"usb"是否在某處的行中(並且我們在檢查之前將行轉換為小寫,以便我們也能在原始行中捕獲"USB"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM