Persian/Arabic 个字符 Python 记录

Persian/Arabic Chars in Python Logging

我通过此 link 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”)的字符串没有任何问题。但是包含 Persian/Arabic 个字符的字符串 "سلام" 会引发异常:

--- 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就可以了。