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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Python2:如何可靠地解析在另一个进程中保持打开状态的日志文件?_Python_File_Logging - Fatal编程技术网

Python2:如何可靠地解析在另一个进程中保持打开状态的日志文件?

Python2:如何可靠地解析在另一个进程中保持打开状态的日志文件?,python,file,logging,Python,File,Logging,我正试图编写一个Python脚本来解析另一个守护进程生成的日志文件。这是在Linux上完成的。我希望能够可靠地解析日志文件 换句话说,我们定期运行一个脚本,逐行读取日志文件,并对每一行执行一些操作。日志脚本需要查看日志文件中可能出现的每一行。它可以通过cron每分钟运行一次 这里有一个问题,我不知道该如何解决。由于另一个进程对该文件有一个写句柄,因此它可以在我从同一个日志文件读取的同时写入 此外,我们经常希望清除此日志文件,以便其大小不会失控。但是,生成日志文件的过程除了定期停止、截断或删除文件

我正试图编写一个Python脚本来解析另一个守护进程生成的日志文件。这是在Linux上完成的。我希望能够可靠地解析日志文件

换句话说,我们定期运行一个脚本,逐行读取日志文件,并对每一行执行一些操作。日志脚本需要查看日志文件中可能出现的每一行。它可以通过cron每分钟运行一次

这里有一个问题,我不知道该如何解决。由于另一个进程对该文件有一个写句柄,因此它可以在我从同一个日志文件读取的同时写入

此外,我们经常希望清除此日志文件,以便其大小不会失控。但是,生成日志文件的过程除了定期停止、截断或删除文件,然后重新启动之外,无法清除文件。(我觉得logrotate有一些方法可以做到这一点,但我不知道logrotate是否依赖于守护进程的感知,或者它是否真的在关闭和重新启动守护进程,等等。更不用说我不希望其他日志被旋转,只需要这一个特定的日志;我不希望这个脚本要求其他可能的用户设置logrotate。)

问题是:

  • 由于记录器进程可以在我已经有一个打开的文件句柄的情况下写入文件,因此我觉得我可能很容易丢失日志文件中的记录
  • 如果记录器进程决定停止、清除日志文件并重新启动,并且日志分析器没有在完全相同的时间运行,那么日志条目将丢失。类似地,如果日志分析器导致记录器在分析时停止日志记录,则由于记录器守护进程未侦听而丢弃的信息也可能丢失
  • 如果我使用类似“注意上次以来文件的大小,如果文件更大,则在此处查找”的方法,那么如果出于某种原因,在两次运行之间,记录器重置日志文件,但随后有理由记录比上次包含的更多的日志,会发生什么情况?例如,我们执行一个日志分析循环。我们得到50个日志条目,所以我们设置了一个标记,表示我们已经读取了50个条目。下次运行时,我们将看到60个条目。但是,所有60个都是全新的;自上次日志运行以来,该文件已被清除并重新启动。相反,我们最终寻找第51个条目,却丢失了50个条目!不管怎样,它都不能解决需要定期清除日志的问题
  • 我无法控制记录器守护进程。(假设我们在这里讨论的是syslog之类的东西,它不是syslog,而是相同的想法——一个相当关键的过程可以打开一个日志文件。)所以我无法更改它的日志记录方法。它从init时间开始,打开一个日志文件,并写入其中。我们希望能够清除该日志文件并对其进行分析,确保在某个时候通过Python脚本获得每个日志条目

    理想的情况是:

  • 日志守护进程在系统初始化时运行
  • 通过cron,Python日志分析器每分钟运行一次(或每5分钟运行一次,或任何认为合适的操作)
  • 日志分析器从当前日志文件中收集每一行,并立即截断它,导致日志文件被清除。Python在列表中维护原始内容
  • 然后,记录器继续进行其业务,现在文件为空。同时,Python可以继续在空闲时从内存中的Python列表中解析条目
  • 我已经非常非常模糊地研究了fifo,但不确定这是否合适。在这种情况下,日志分析器本身将作为守护进程运行,而原始记录器将写入FIFO。然而,我在这方面的知识很少,也不知道这是否是一个解决方案

    所以我想问题有两个方面:

  • 如何可靠地从Python读取写入日志的每个条目?包括日志是否增长、是否重置等
  • 如果可能,如何截断具有打开写入句柄的文件?(理想情况下,这将是我可以从Python中执行的操作;我可以执行类似于
    logfile.readlines();logfile.truncate
    的操作,这样就不会丢失任何条目。但这似乎是除非记录器进程很好地意识到这一点,否则它最终会导致比它解决的问题更多的问题。)

  • 谢谢

    我看不出您不能读取syslogd创建的日志文件的任何特殊原因。您是说您正在使用一些类似于syslog的进程,而该进程正在保持日志文件的打开状态?既然您是在征求意见,我建议您使用syslog

    无论如何,它都在工作——使用它。写入日志的一些简单方法是使用logger命令:

    logger “MYAP: hello”
    
    在python脚本中,您可以像这样执行:

    import os
    os.system(‘logger “MYAP: hello”’)
    
    还请记住,您实际上可以配置syslogd

    还有关于空日志的问题–sysclog没有清除日志。还有其他工具可以使用,比如在debian上使用logrotate。在这种情况下,如果日志为空,则可以检查由logrotate创建的备份文件

    由于您的问题似乎出现在日志记录工具中,所以我的建议是使用syslog进行日志记录。和其他旋转原木的工具。然后您可以轻松地解析日志。如果通过任何方式(我不知道是否可以使用syslog)丢失一些数据,请记住,您将在下一次迭代中获得这些数据;)


    另一个想法是复制日志文件并使用copy…

    几年后,我再次讨论这个问题,但它又出现了:-)问题是记录日志的过程不是我写的。应用程序只需打开一个日志文件,并在运行时写入。我不能改变那种行为。定期终止并重新启动该过程也是不可接受的。如果我可以用Python打开文件,读取内容,然后截断文件并将其文件指针移到0,那么做日志记录的应用程序就可以启动了