【问题标题】:redirecting python logging messages with streams使用流重定向 python 日志消息
【发布时间】:2013-08-23 14:21:54
【问题描述】:

我想将日志消息重定向到某种处理方法(例如,为了将所有消息保存在队列中)。目前我正在尝试使用 logging.StreamHandler 来写入 StringIO 然后在其他地方读取它。在我的情况下,这可能是一个线程不断从流中读取,但它也可能是在每个日志条目上调用的回调方法。

import threading
import time
import sys
import logging
from StringIO import StringIO

# this thread shall read from a stream 
# continuously and 
def tread_fn( stream ):
    while not stream.eof():       <=== this is not valid but my current approach
        l = stream.readline()
        do_something( l )

stream = StringIO()

handler = logging.StreamHandler(stream)
log = logging.getLogger()
log.setLevel( logging.INFO )

# replace all log handlers
for handler in log.handlers: 
    log.removeHandler(handler)
log.addHandler(handler)

thread = threading.Thread(target = tread_fn, args=[stream])
thread.start()

for i in range(3):        
    time.sleep(1)
    log.error("test")          <=== should be handled line by line

我觉得我忽略了非常明显和简单的最佳实践,但我现在挣扎了一段时间 :) 也许我根本不需要流,但目前我什至无法写入流并在其他地方读取它.. 所以简而言之,我的问题是:

  • 主要目标是如何通过python方式实现的?

  • 如何将字符串写入流并在另一个线程中连续读取?

【问题讨论】:

  • 一种选择是编写自己的处理程序,将其传入的日志记录放到队列中。然后后台线程将一次读取一个记录(注意,不需要序列化)。不过,这有点取决于您接下来想做什么。

标签: python logging stream handler stringio


【解决方案1】:

您已同时提出了两个问题 - 它们应该是不同的问题。您的主要目标可以使用例如实现QueueHandler,可用于 Python 3.2 及更高版本,但也可通过 logutils 项目用于早期 Python 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2020-06-26
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2021-10-30
    • 2011-10-07
    相关资源
    最近更新 更多