Python日志中的波斯语/阿拉伯语字符

2022-05-21 08:41:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过这个链接的conf文件设置使用python中的日志库https://realpython.com/python-logging/ 我写下这些代码:

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'

我的问题是“有没有办法在日志文件中使用波斯语字符而不进行编码以提高可读性?”


Tags: 文件inpyinfologmainformatterlogginghandlersconfkeysloggerlevelencodeconsolehandler
1条回答
网友
1楼 ·

我认为日志模块在控制台流上以某种方式获取了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,环境变量就应该工作