我在Python 3中使用“logging”将一些Unicode字符记录到文件中。代码在终端中工作,但在PyCharm中失败并出现UnicodeEncodeError。
我使用logging.config.fileConfig
加载我的日志配置。在配置中,我使用encoding = utf-8
指定文件处理程序。登录到控制台工作正常。
我正在使用PyCharm 2019.1.1(社区版)。我不认为我已经更改了任何相关设置,但是当我在另一台计算机上的PyCharm中运行相同的代码时,错误没有被重现。因此,我怀疑这个问题与PyCharm设置有关。
这是一个最小的例子:
import logging
from logging.config import fileConfig
# ok
print('1. café')
# ok
logging.error('2. café')
# UnicodeEncodeError
fileConfig('logcfg.ini')
logging.error('3. café')
logcfg.ini的内容(在同一目录中)如下:
[loggers]
keys = root
[handlers]
keys = file_handler
[formatters]
keys = formatter
[logger_root]
level = INFO
handlers = file_handler
[handler_file_handler]
class = logging.handlers.RotatingFileHandler
formatter = formatter
args = ('/tmp/test.log',)
encoding = utf-8
[formatter_formatter]
format = %(levelname)s: %(message)s
我希望在控制台中看到前两条日志消息,在日志文件中看到第三条日志消息。前两个日志记录工作正常,但第三个记录失败。这是PyCharm中完整的控制台输出:
1. café
ERROR:root:2. café
--- Logging error ---
Traceback (most recent call last):
File "/anaconda3/lib/python3.6/logging/__init__.py", line 996, in emit
stream.write(msg)
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 13: ordinal not in range(128)
Call stack:
File "/Users/klkh/test.py", line 12, in <module>
logging.error('3. café')
Message: '3. café'
Arguments: ()
您似乎使用utf-8
作为您的配置文件的编码,python(当使用pycharm)在您的情况下似乎引发编码错误UnicodeEncodeError
代替猜测您的配置文件编码疯狂,因为如果它使用错误编码所有配置文件将解密与原始解密不同,所以最好做的是在python脚本中精确配置编码类型
注意:我似乎无法找到fileConfig from logging.config
的文档,所以我使用的是basicConfig
import logging
from logging.config import fileConfig
print('1. café')
logging.error('2. café')
logging.basicConfig(filename='your config' , encode='utf-8') # in your case the encode is utf-8
logging.error('3. café')
输出:
1. café
ERROR:root:2. café
ERROR:root:3. café
我自己找到了解决方案。我应该像这样传递编码:
args = ('/tmp/test.log', 'a', 0, 0, 'utf-8')
代替
args = ('/tmp/test.log',)
encoding = utf-8
但是,我仍然有兴趣知道为什么另一台计算机上的PyCharm默认使用utf-8。如何在PyCharm中设置非控制台流的默认编码?