我想打印在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有关)
答案 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
...
这里有一些不同之处:
我们正在使用with
context manager打开文件。这有助于Python即使出现问题也可以清理和关闭文件,这是一个很好的习惯。
在Python中,我们称之为文件变量f
。 fd
会让某人阅读您的代码,认为您在谈论的是file descriptor,这不是一回事。
由于它只有一行,我们会调用字符串变量line
,而不是lines
。
我们可以检查"usb"
是否在某个地方(并且我们在检查前将该行转换为小写,以便我们捕获"USB"
,而不是正则表达式。原来也是。