logging日志模块写入中文编码错误解决办法

 一、问题:

  使用python的logging模块记录日志,有时会遇到中文编码问题错误。

二、解决办法:

  在logging.FileHandler(path) 中添加指定编码方式 encoding='utf-8' 即可,logging.FileHandler(path, encoding='utf-8') 。

  示例日志模块代码:

import logging,sys

filelog = True
path = r'log.txt'

logger = logging.getLogger('log')
logger.setLevel(logging.DEBUG)

# 调用模块时,如果错误引用,比如多次调用,每次会添加Handler,造成重复日志,这边每次都移除掉所有的handler,后面在重新添加,可以解决这类问题
while logger.hasHandlers():
    for i in logger.handlers:
        logger.removeHandler(i)

# file log
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
if filelog:
    fh = logging.FileHandler(path,encoding='utf-8')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)

# console log
formatter = logging.Formatter('%(message)s')
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)

if __name__ == '__main__':
    logger.info("这是一个测试")

 另一个解决方法

import logging
file = open("log", encoding="utf-8", mode="a")
logging.basicConfig(level=logging.DEBUG,
                    stream=file,
                    format="%(asctime)s "
                           "%(filename)s [line:%(lineno)d] "
                           "%(levelname)s\n"
                           "%(message)s",
                    datefmt="%a, %d %b %Y %H:%M:%S"
                    )

logging.debug("调试信息")
logging.info("普通信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("严重错误信息")
file.close()

stream : 日志的输出流,可以指定输出到 sys.stderr, sys.stdout 或者文件, 默认输出到 sys.stderr, 当 stream 和 filename 同时指定时, stream 被忽略
利用 stream 输出到文件便可以解决编码问题, 然而这样一来却也带来了一些问题
首先, 文件在程序运行过程中必须始终保持打开状态
其次, 不能同时进行写入文件与控制台输出

posted @ 2019-10-15 20:36  汉学  阅读(1754)  评论(0编辑  收藏  举报