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