是否可以输出和监视除stdin,stdout和amp;之外的流。标准错误? (蟒蛇)

时间:2015-09-28 06:59:35

标签: python linux macos terminal stdout

这是一个python问题,但也是一个linux / BSD问题。

我有一个带有两个线程的python脚本,一个从Web下载数据,另一个通过串口将数据发送到设备。这两个线程都使用python的logging模块向stdout打印了很多状态信息。

我想要的是并排打开两个终端窗口,并让每个终端窗口显示一个线程的输出,而不是在一个窗口中交错传输两个终端窗口。

是否有stdin,stdout和amp;以外的文件描述符stderr写入并连接到其他终端窗口?也许用GUI可以更好地实现这个愿望?

我不知道如何开始这个。

编辑:我尝试将状态消息写入两个不同的文件,而不是将它们打印到stdout,然后在其他终端窗口中使用tail -f监视这两个文件,但这不适用于实时监控,因为在你打电话给close()之前,不会写入文件。

2 个答案:

答案 0 :(得分:2)

首先,自定义日志记录格式化程序以包含线程ID 字段(https://docs.python.org/2/library/logging.html#logrecord-attributes)。然后将您的日志记录目标更改为某个文件而不是标准输出。

# A simple logger as print
import logging
import logging.handlers

hdr = logging.FileHandler(filename='output.log')
hdr.setFormatter(logging.Formatter('[%(asctime)s] thread=%(thread)s:%(levelname)s: %(message)s'))
logger = logging.getLogger(__name__)
logger.addHandler(hdr)
logger.setLevel(logging.DEBUG)

import threading


def func():
    logger.info('test message')


for i in range(2):
    threading.Thread(target=func).start()

您的日志记录输出现在可能如下所示:

% tail -f output.log
[2015-09-28 15:14:49,782] thread=4344852480:INFO: test message
[2015-09-28 15:14:49,782] thread=4349059072:INFO: test message

运行脚本,打开两个终端,并使用命令tail -f output.log | grep thread=<THREAD_ID>按线程ID监控日志。

答案 1 :(得分:0)

默认情况下,文件写入操作是缓冲的,因此在缓冲区已满,文件关闭或您明确调用文件flush()之前,文件不会被写入。

但无论如何:如果你想登录到一个文件,不要使用直接文件访问,使用带有打开文件的logging.StreamHandler作为流,或者更好的是{{1} }。两者都将负责刷新文件。