这是一个python问题,但也是一个linux / BSD问题。
我有一个带有两个线程的python脚本,一个从Web下载数据,另一个通过串口将数据发送到设备。这两个线程都使用python的logging
模块向stdout打印了很多状态信息。
我想要的是并排打开两个终端窗口,并让每个终端窗口显示一个线程的输出,而不是在一个窗口中交错传输两个终端窗口。
是否有stdin,stdout和amp;以外的文件描述符stderr写入并连接到其他终端窗口?也许用GUI可以更好地实现这个愿望?
我不知道如何开始这个。
编辑:我尝试将状态消息写入两个不同的文件,而不是将它们打印到stdout,然后在其他终端窗口中使用tail -f
监视这两个文件,但这不适用于实时监控,因为在你打电话给close()
之前,不会写入文件。
答案 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} }。两者都将负责刷新文件。