Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中读取和打印与USB相关的var日志消息_Python_File_Ubuntu_Syslog - Fatal编程技术网

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

在Python中读取和打印与USB相关的var日志消息,python,file,ubuntu,syslog,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文件是否正确。但是,我确实在其中找到了很多消息,有些消息

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

对于最新的消息,您需要
/var/log/syslog
-
/var/log/syslog.1
基本上是旧消息的备份

阻止代码工作的原因是您正在使用而不是,正如您从这些链接的文档中所看到的,
re.match()
只匹配正在搜索的文本的开头

但实际上,您根本不需要使用正则表达式。以下是代码的替代方案:

>>> with open("/var/log/syslog") as f:
...     for line in f:
...         if "usb" in line.lower():
...             print line
... 
这里有几点不同:

  • 我们正在使用打开文件。这有助于Python在出现问题时清理和关闭文件,这是一个好习惯

  • 与Python中的常规方法一样,我们将文件变量称为
    f
    fd
    会让阅读你的代码的人认为你在谈论一个,这不是一回事

  • 因为它只包含一行,所以我们将调用字符串变量
    line
    ,而不是
    line

  • 与正则表达式不同,我们只需检查
    “usb”
    是否在某个行中(在检查之前,我们将该行转换为小写,以便我们也能捕获原始行中的
    “usb”


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

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

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


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

    非常感谢您对Zero的详细解释!起初,我正在查看syslog,但在更新后,它没有与usb相关的信息。因此我决定使用syslog。1file@SidNoob没问题:-)如果你准备做一些额外的工作,您也可以使用和模块来搜索代码中的
    syslog.1
    syslog.2.gz
    等文件。