我的 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()
函数需要字节。
答案 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)