3

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

4

2 回答 2

3

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

但重点是:有时打开“/var/log/syslog”之类的文件进行读取可能会占用大量内存,因为您正在将文件加载到 RAM 中。在服务器类型的环境中,这可能会运行到 MB 甚至更长的时间。有一个命令“dmesg”,无论“var/log/syslog”文件的内容是什么,它都会打印到标准输出。因此,除了打开这个大文件之外,您还可以将“dmesg”的输出存储到一个字符串中,然后逐行解析。

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

希望这会增加您的知识和程序。

于 2013-07-23T06:48:35.603 回答
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上下文管理器打开文件。即使出现问题,这也有助于 Python 清理和关闭文件,这是养成的好习惯。

  2. 按照 Python 的惯例,我们将文件变量称为f. fd会让阅读您的代码的人认为您在谈论文件描述符,这不是一回事。

  3. 由于它只有一行,我们将调用字符串变量line,而不是lines

  4. 而不是正则表达式,我们可以只检查是否"usb"在某处的行中(并且我们在检查之前将行转换为小写,以便我们也可以捕获"USB"原始行。

于 2013-07-23T04:21:20.760 回答