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

1 人关注

我在Python中通过这个链接中的conf文件设置使用日志库 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'))

outputs in log file:

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

My question is "有什么办法可以在日志文件中写上波斯文字符,而不进行编码,以便于人类阅读?"

5 个评论
【替换代码0- 这将记录字符串的 repr ,而不是试图对这些字符进行编码。
但这可能不会有更多的可读性。 把你的终端设置为处理UTF-8,并为你的程序设置 PYTHONIOENCODING 环境变量为 UTF-8 ,可能会更好。
@snakecharmerb , 谢谢你的帮助!我尝试了 logger.info('%r', 'سلام'.encode('utf-8')) ,得到了之前的输出。 b'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85' 。 另一次我尝试了 logger.info('%r', 'سلام') ,我得到了异常。 我没有发现我的代码和你建议的代码有什么不同。请给我一个例子或更多的解释。
是的,所以更好的计划是在UTF-8环境下运行你的代码:见 如何在windows命令行中使用unicode字符 Python, unicode和the Windows console
再次感谢@snakecharmerb。我正在使用pycharm IDE。这个链接说的是cmd。难道这些环境之间没有区别吗?
python
logging
utf-8
arabic
farsi
Alireza Mazochi
Alireza Mazochi
发布于 2020-09-16
1 个回答
Mark Tolonen
Mark Tolonen
发布于 2020-09-18
已采纳
0 人赞同

我认为日志模块以某种方式在控制台流中接收了 cp1252 的编码。 设置环境变量 PYTHONIOENCODING=utf8 并不能解决这个问题,但如果使用Python 3.7或更高版本的 PYTHONUTF8=1 (强制所有地方的UTF-8默认值),就能让它对我起作用,我在控制台(cmd.exe,使用适当的字体)记录了以下内容。

Hello