python 3.6*logging modul error*UnicodeEncodeError:'charmap'编解码器无法编码字符

J. *_*oes 9 logging encoding error-logging character-encoding python-3.x

在Windows 10上,日志记录模块发送此错误(使用scrapy)

# --- Logging error ---
...
# UnicodeEncodeError: 'charmap' codec can't encode characters in position 175-176: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

我已经读过我应该添加,encoding='utf-8'但我没有找到如何在下面的代码中添加它. 编辑:根据tuto,它是不需要的.

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 
)
Run Code Online (Sandbox Code Playgroud)

我发现了很多关于这些主题的问题,但主要是关于python 2(或者与日志记录模块无关).日志教程甚至没有谈论utf-8.(请注意,我可以毫无问题地打印UTF8字符.问题只发生在记录模块上)

sms*_*rcy 12

我没有使用Scrapy但我遇到了同样的问题,因为vanilla Python 3.6无法将UTF-8字符写入logging文件(控制台工作得很好).

根据这个评论我添加'utf-8'到我的FileHandler初始化.我正在通过INI文件配置日志记录,所以它看起来像这样:

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

使用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 
)
Run Code Online (Sandbox Code Playgroud)