Python记录中的波斯/阿拉伯字符

问题描述

我通过此链接https://realpython.com/python-logging/中的conf文件设置在python中使用日志记录库 我写这段代码

log.conf.conf

[loggers]
keys=root,sampleLogger

[handlers]
keys= consoleHandler,fileHandler

[formatters]
keys=fileFormatter,consoleFormatter

[logger_root]
level=DEBUG
handlers=fileHandler,consoleHandler

[logger_sampleLogger]
level=DEBUG
handlers=consoleHandler
qualname=sampleLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=fileFormatter
level=DEBUG
args=('../logs/log.log',)

[formatter_fileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_consoleFormatter]
format=%(message)s 


main.py

logging.config.fileConfig(fname='../configs/log_conf.conf',disable_existing_loggers=False)
logger = logging.getLogger('main')

logger.info('Hello')
logger.info('سلام')

包含英语字符的记录字符串喜欢“ Hello”,但没有任何问题。但是包含波斯/阿拉伯字符的字符串“سلام”会引发异常:

--- Logging error ---
Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\python37\lib\logging\__init__.py",line 1028,in emit
    stream.write(msg + self.terminator)
  File "C:\Users\user\AppData\Local\Programs\Python\python37\lib\encodings\cp1252.py",line 19,in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 40-43: character maps to <undefined>
Call stack:
  File "D:/Alireza/Code/addresstomaplocation/main/main.py",line 11,in <module>
    logger.info('سلام')
Message: 'سلام'
Arguments: ()

因此,我尝试了“ utf-8”解码,这种方式可以正常工作,但是显然人类无法读取日志文件

logger.info('سلام'.encode('utf-8'))

日志文件中的输出

2020-09-16 18:55:00,949 - main - INFO - b'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'

我的问题是“有没有办法编写带有波斯字符的日志文件而无需进行人类可读性编码?”

解决方法

我认为日志记录模块正在以某种方式在控制台流上获取cp1252编码。设置环境变量PYTHONIOENCODING=utf8不能解决问题,但是如果使用Python 3.7或更高版本PYTHONUTF8=1(在所有位置强制使用UTF-8默认值)使它对我有用,我将以下内容记录到了控制台(cmd .exe,并带有适当的字体):

Hello
سلام

,然后将以下内容添加到日志文件:

2020-09-17 13:52:51,169 - main - INFO - Hello
2020-09-17 13:52:51,170 - main - INFO - سلام

我没有Pycharm,但是只要您在设置Pycharm后重新启动,环境变量就应该起作用。