Python 3.6 *logging模块错误* UnicodeEncodeError: 'charmap'编解码器无法编码字符

18
在Windows 10上,日志模块发送了这个错误(使用scrapy)
# --- Logging error ---
...
# UnicodeEncodeError: 'charmap' codec can't encode characters in position 175-176: character maps to <undefined>

我读到过应该添加encoding='utf-8',但我没有找到如何在下面的代码中添加它。编辑:根据教程,这不是必需的。

configure_logging(install_root_handler=False) #override default log settings
logging.basicConfig(
    filename='logfile.log',
    format='%(levelname)s: %(message)s',
    datefmt='%m-%d %H:%M',
    level=logging.INFO #CRITICAL ERROR WARNING  INFO    DEBUG    NOTSET 
)

我在相关主题上发现了许多问题,但大多数是关于Python 2的(或与日志模块无关)。而且日志教程甚至不提及UTF-8。(请注意,我可以轻松地打印UTF8字符。问题仅出现在日志模块中)

1个回答

34

我没有使用 Scrapy,但是我在使用纯 Python 3.6 日志记录时遇到了同样的问题,即无法通过 logging 将 UTF-8 字符写入文件(控制台却可以正常工作)。

根据此评论,我将'utf-8'添加到了我的FileHandler初始化中。我通过INI文件配置日志记录,所以看起来像这样:

[handler_file]
class = FileHandler
args = (r'log.txt', 'a', 'utf-8')
level = NOTSET
formatter = generic

使用 logging.basicConfig(),我认为你应该能够执行以下操作:

configure_logging(install_root_handler=False) #override default log settings
logging.basicConfig(
    handlers=[logging.FileHandler('logfile.log', 'w', 'utf-8')],
    format='%(levelname)s: %(message)s',
    datefmt='%m-%d %H:%M',
    level=logging.INFO #CRITICAL ERROR WARNING  INFO    DEBUG    NOTSET 
)

使用 logging.basicConfig() 的答案对我无效。 - SomJura
@SomJura,您能说得更具体一些吗?我刚在Python 3.8上尝试了一下,它似乎可以工作(我跳过了configure_logging()的调用)。 - smsearcy
在Windows系统中是否可能实现? 面对相同的问题,我尝试了上述解决方案,但它并没有起作用。我正在使用Python 3.8.10版本。我尝试删除导入语句'import logging',但这会导致错误。 “NameError:name 'logging' is not defined” - Abhirami V S
@Abhi,我最开始在Windows中遇到了这个问题,因此它应该可以在Windows上运行。你遇到了什么错误?回顾第二个logging.basicConfig()的例子,我不确定带有configure_logging()的第一行在那里做什么,如果你将其删除会发生什么?你需要import logging - smsearcy
@smsearcy,将Python版本升级到3.9即可解决错误。我在https://bugs.python.org/issue37111上看到了这个问题,并且修复已经在Python 3.9中实现。 - Abhirami V S
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接