如何解决loguru的add_level_bytes方法导致的日志文件乱码问题

问题现象与背景

在使用Python的loguru库进行日志记录时,add_level_bytes方法允许开发者直接写入字节数据到日志文件。然而许多用户报告,当使用该方法写入非ASCII字符时,日志文件会出现乱码、截断或不可读的情况。这种情况特别容易发生在处理多语言文本、二进制数据或特殊字符的场景中。

根本原因分析

通过深入调查发现,该问题主要由以下三个因素导致:

  1. 编码不匹配:系统默认编码与日志文件实际编码不一致
  2. 字节流处理缺陷:add_level_bytes未正确处理字节到字符串的转换
  3. 文件打开模式问题:日志文件以文本模式而非二进制模式打开

解决方案

方案一:强制指定编码格式

logger.add("file.log", 
          encoding="utf-8",
          format="{message}")

方案二:使用编码转换中间层

在调用add_level_bytes前,先对数据进行统一编码:

data = "中文内容".encode('utf-8')
logger.level("BYTES", no=38).add_level_bytes(data)

方案三:修改文件打开模式

@logger.catch
def write_bytes(byte_data):
    with open("file.log", "ab") as f:
        f.write(byte_data)

最佳实践建议

  • 始终明确指定文件编码格式
  • 对非ASCII内容进行预编码处理
  • 考虑使用base64编码处理二进制数据
  • 定期验证日志文件的可读性

进阶技巧

对于需要同时处理文本和二进制数据的场景,建议实现自定义的日志处理器

class MixedHandler:
    def __init__(self, file_path):
        self.text_logger = logger.add(file_path)
        self.bytes_logger = logger.level("BYTES")
    
    def write(self, data):
        if isinstance(data, bytes):
            self.bytes_logger.add_level_bytes(data)
        else:
            self.text_logger.info(data)