Персидские/арабские символы в ведении журнала Python

Я использую библиотеку ведения журнала в 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'))

выводит в файл журнала:

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

Мой вопрос: Есть ли способ записи в файл журнала с персидскими символами без кодирования для удобочитаемости?


person Alireza Mazochi    schedule 16.09.2020    source источник
comment
logger.info('%r', my_unicode_string) — это будет регистрировать repr строки, а не пытаться кодировать символы.   -  person snakecharmerb    schedule 16.09.2020
comment
Но это, вероятно, не будет намного более читаемым. Возможно, было бы лучше настроить ваш терминал для обработки UTF-8 и установить переменную среды PYTHONIOENCODING в значение UTF-8 для вашей программы.   -  person snakecharmerb    schedule 16.09.2020
comment
@snakecharmerb, спасибо за помощь! Я попробовал logger.info('%r', 'سلام'.encode('utf-8')) и получил предыдущий результат: b'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'. В другой раз я попробовал logger.info('%r', 'سلام') и получил исключение. Я не нахожу разницы между моим кодом и вашим кодом предложения. пожалуйста, дайте мне пример или более подробное объяснение.   -  person Alireza Mazochi    schedule 16.09.2020
comment
Да. Поэтому лучший план — запустить код в среде UTF-8: см. line">как использовать символы Юникода в командной строке Windows и Python, юникод и консоль Windows   -  person snakecharmerb    schedule 16.09.2020
comment
Еще раз спасибо @snakecharmerb. Я работаю с Pycharm IDE. Эта ссылка говорит о cmd. Разве нет разницы между этими средами?   -  person Alireza Mazochi    schedule 17.09.2020
comment
Я не использую ни PyCharm, ни Windows, поэтому не могу дать подробных советов. Однако UnicodeEncodeError происходит из-за того, что кодировка цели для вывода (эмулятор терминала PyCharm) не может кодировать персидские символы. Вы можете попробовать установить PYTHONIOENCODING в настройке переменной среды здесь< /а>.   -  person snakecharmerb    schedule 17.09.2020


Ответы (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 после ее установки.

person Mark Tolonen    schedule 17.09.2020
comment
Ваш способ предложения работает для меня! Большое спасибо, мой друг! - person Alireza Mazochi; 18.09.2020
comment
Для других читателей это хорошая ссылка для установки PYTHONUTF8=1 : enable-utf-8-encoding-by-def">ссылка - person Alireza Mazochi; 18.09.2020