如何使用 python 日志记录将字节记录到一个处理程序,并将 unicode 记录到另一个处理程序?

时间:2021-05-06 13:59:57

标签: python-3.x python-logging

我的 python3 应用程序中有一个复杂(但相当标准)的 log 设置。使用单个日志功能,然后各种处理程序将这些日志分发到不同的地方,例如控制台输出、日志文件和硬件串行端口。这在 python2 中运行良好,但我正在转换为 python3 并开始遇到问题。控制台和文件输出处理程序需要 unicode,但处理串行输出的 StreamHandler 需要字节编码。我没有看到任何方法可以告诉 python 只为单个日志处理程序转换为字节。

以下是部分代码供参考:

serial_handler = logging.StreamHandler(serial)
serial_handler.setLevel(logging.DEBUG)
serial_handler.setFormatter(serial_formatter)
self._log.addHandler(serial_handler)

fh = logging.FileHandler(file_name)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
self._log.addHandler(fh)

然后可以调用 self._log.debug("Hello, world!")。但是它将向 FileHandler 发送 unicode,这是正确的,但也会发送到 StreamHandler,这将失败,因为它需要在 logging.Formatter 函数发生后将其编码为字节,而我不不知道如何做到这一点。

注意 serial 在这种情况下是 pySerial 类的一个实例。它的 .write() 函数需要字节。

1 个答案:

答案 0 :(得分:1)

我最终编写了一个似乎有效的自定义处理程序。但我仍然很想看到提议的替代方案。

from logging import StreamHandler

class SerialHandler(StreamHandler):

    def __init__(self, serial):
        StreamHandler.__init__(self, serial)

    def emit(self, record):
        try:
            msg = self.format(record)
            stream = self.stream
            stream.write(bytes(msg + self.terminator, 'utf-8'))
            self.flush()
        except RecursionError:
            raise
        except Exception:
            self.handleError(record)