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



我的python3应用程序中有一个复杂(但相当标准(的日志设置。使用一个日志函数,然后各种处理程序将这些日志分发到不同的地方,例如控制台输出、日志文件和硬件串行端口。这在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)

则可以调用CCD_ 1。但它会将unicode发送到FileHandler,这是正确的,但也会发送到StreamHandler,这将失败,因为它需要在日志记录后编码为字节。格式化程序功能已经发生,我不知道如何实现。

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

我最终编写了一个自定义处理程序,它似乎正在工作。但我仍然很想看到拟议的替代方案。

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)

最新更新