Я использую библиотеку ведения журнала в 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'
Мой вопрос: Есть ли способ записи в файл журнала с персидскими символами без кодирования для удобочитаемости?
logger.info('%r', my_unicode_string)
— это будет регистрироватьrepr
строки, а не пытаться кодировать символы. - person snakecharmerb   schedule 16.09.2020PYTHONIOENCODING
в значениеUTF-8
для вашей программы. - person snakecharmerb   schedule 16.09.2020logger.info('%r', 'سلام'.encode('utf-8'))
и получил предыдущий результат:b'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
. В другой раз я попробовалlogger.info('%r', 'سلام')
и получил исключение. Я не нахожу разницы между моим кодом и вашим кодом предложения. пожалуйста, дайте мне пример или более подробное объяснение. - person Alireza Mazochi   schedule 16.09.2020UnicodeEncodeError
происходит из-за того, что кодировка цели для вывода (эмулятор терминала PyCharm) не может кодировать персидские символы. Вы можете попробовать установитьPYTHONIOENCODING
в настройке переменной среды здесь< /а>. - person snakecharmerb   schedule 17.09.2020