在Python中读取和打印与USB相关的var日志消息

时间:2013-07-23 03:52:32

标签: python file ubuntu syslog

我想打印在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有关)

2 个答案:

答案 0 :(得分:3)

@SidNoob:添加到日志主题(可能与python无关),我假设您正在寻找来自usb守护程序或驱动程序的日志。如果是这种情况,您可能正在查看正确的日志文件“/ var / log / syslog”,该文件记录内核相关消息(包括驱动程序)。如果它是一个应用程序(具有不同的日志级别),那么您可能必须查看“/ var / logs / messages”。

但是要进入POINT:有时打开像“/ var / log / syslog”这样的文件进行读取可能会占用大量内存,因为您正在将文件加载到RAM中。在服务器类型环境中,这可能会长达MB甚至更长。有一个命令“dmesg”只是打印到stdout,无论“var / log / syslog”文件的内容是什么。所以不要打开这个大文件,你也可以将“dmesg”的输出存储到一个字符串中逐行解析。

您可能认为两种方式都是相同的,并且可能在运行python程序时占用相同的内存。是的,但如果你清除“dmesg”输出则不行。 “dmesg”是一个环形缓冲区,因此您可以在运行usb应用程序之前使用“dmesg -c”将其清除,并在启动应用程序后发出“dmesg”。通过这种方式,您可以减少解析的行数,从而加快程序的速度。

希望这会增加您的知识和计划。

答案 1 :(得分: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",而不是正则表达式。原来也是。