使用readline和另一种方法的组合将子进程stderr拆分为整洁的日志记录

问题描述

我目前有这个代码

for line in iter(command.stderr.readline,b''):
    line = line.rstrip().decode('utf8')
    logger.debug(line)

我从中读取 stderr 的命令是 rsync。有时,日志中会出现多行作为单个条目,而我只想在每个日志消息中记录一个操作。

例如,日志输出如下:

DEBUG: copying .... gs://xxxxx
DEBUG: copying .... gs://xxxxx copying .... gs://xxxxx copying .... gs://xxxxx copying .... gs://xxxxx 
DEBUG: copying gs://xxxxx

正如上面所希望的那样,它没有成功地将 stderr 的每一行拆分出来。

我希望将每一行都分开,以便每一行都以“复制”开头。我怎样才能从 stderr 获取这个 readline 输出并进一步过滤它,以便每次出现“复制”这个词时都会产生一个新行?

谢谢,如果我能说得更清楚,请告诉我。

解决方法

如果我理解正确,您只想拆分包含多个复制操作的行。为此,您可以在任何字符之后(以防止第一个字符串为空)和 date month_start_date 0 2018-08-01 1 1 2018-08-02 2 2 2018-08-03 3 3 2018-08-04 4 4 2018-08-05 5 之前对 re.split 使用正则表达式:

"Copying"

在您的循环中,这可能看起来例如像这样(未测试):

>>> s = "Copying .... Copying .... Copying .... Copying ...."
>>> re.split("(?<=.)(?=Copying)",s)
['Copying .... ','Copying .... ','Copying ....']

注意:在 Python 3.7 中的 re.split 中添加了对空模式的拆分