Python中如何解决logging模块出现的GBK编码错误问题
打 log 的时候,因为会出现 emoji,而 gbk 是不支持 emoji 的,所以刚开始的时候在 windows 机器上(部署程序的机器)的终端打印的 log 会出现 encode error 问题🤦
因为没办法,我们写了个 handler,将 log 存到数据库里面,basic logger 设置成存入日志文件中,以为不在终端打印 emoji 什么的就不会出现问题,但是依然报错😂😂😂
请问,有没有遇见过这种情况的,有什么办法可以解决啊.关键是这个错误是 logging error,都捕获不到异常...
Python中如何解决logging模块出现的GBK编码错误问题
看不懂你说什么,windows 机器上也用 utf-8 啊,直接用 byte 模式写根本不会有编码问题。
这个问题我遇到过,核心原因是Windows控制台默认使用GBK编码,而你的日志内容包含UTF-8字符。
最直接的解决方案是在配置logging时显式指定编码。下面是一个完整的示例:
import logging
# 方法1:使用basicConfig配置控制台输出(Python 3.9+)
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(), # 控制台输出
logging.FileHandler('app.log', encoding='utf-8') # 文件输出指定UTF-8
]
)
# 方法2:手动配置Handler(兼容性更好)
def setup_logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 控制台Handler - 关键在这里
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 文件Handler - 指定UTF-8编码
file_handler = logging.FileHandler('app.log', encoding='utf-8')
file_handler.setLevel(logging.INFO)
# 设置格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
return logger
# 使用示例
logger = setup_logger()
logger.info("正常日志信息")
logger.info("包含中文的日志 - 测试") # 不会再报GBK错误
如果你只是临时解决控制台输出问题,可以在脚本开头添加:
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
总结:给FileHandler加上encoding='utf-8’参数就能解决。
直接国标码 GB18030 也能支持 emoji
是 utf8 但是显示在终端的时候会内部转成 gbk 导致错误,并不是想用什么显示
你们使用的是这个 handler 吗? <br>class RotatingFileHandler(BaseRotatingHandler):<br> """<br> Handler for logging to a set of files, which switches from one file<br> to the next when the current file reaches a certain size.<br> """<br> def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False):<br>
好像有一个 encoding 的参数
没有,我自己写的 handler,就是很简单的获取后存数据库,另一个就是用 basicConfig 设置成文件输出
遇到了同样的问题,关注
不是,是这样的,一个 str 在 python3 里面肯定是 unicode,在显示的时候肯定要转换成系统终端的编码方式,所以当有 emoji 的时候转换不了所以会报错。你可以写个 print(“😂😂😂”),估计在 win 的中文系统里面也会报错的,这个地方的问题是我没有输出到终端,输出到文本也这样,我怀疑是输出文件的时候也会转码成 gbk
同上,我觉得这个问题可以把原始的 logger remove 出来,然后再添加一个自己用的 file 或者 stream hadler 来解决,最近在弄优先级更高的任务,所以没弄。要是能找到 basicConfig 里面怎么设置 encode 我想也可以。


