В python при форматировании регистратора: %(пользователь) выдает ошибку ключа. В то время как документация python содержит это в качестве ссылки

#python #python-3.x #logging #keyerror

Вопрос:

Конфигурация выглядит следующим образом:

 import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='assignment.log', mode='a')
formatter = logging.Formatter('%(asctime)- %(user)8s -%(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.INFO)
 

код, который выдает ошибку:

 logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning')
 

ошибка вывода:

 KeyError: 'user'
During handling of the above exception, another exception occurred:
ValueError: Formatting field not found in record: 'user'
 

Документация на python, содержащая это в качестве ссылки: https://docs.python.org/3/library/logging.html#logging.Форматирующее устройство

Комментарии:

1. %(user) не отображается в разделе документации, на который вы ссылались.

Ответ №1:

Документация python содержит пользователя в качестве примера пользовательского формата:

 logger.warning('Protocol problem: %s', 'connection reset', **extra=d**)
 

акцент мой. Если вы хотите использовать конструкцию, вам придется отправить свой собственный словарь в качестве дополнительного параметра, например:

 logger.warning('Protocol problem: %s', 'connection reset', extra={"user": "Sarthak"})
 

Ответ №2:

%(user) не отображается в разделе документации, на который вы ссылались. Это появляется только в документации о extra ключевом слове, которое используют определенные функции. Например, logging.debug и аналогичные вызовы:

Третий необязательный аргумент ключевого слова является дополнительным, который можно использовать для передачи словаря, используемого для заполнения записи __dict__ журнала, созданной для события ведения журнала, определенными пользователем атрибутами. Затем эти пользовательские атрибуты можно использовать по своему усмотрению. Например, они могут быть включены в зарегистрированные сообщения. Например:

 FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning('Protocol problem: %s', 'connection reset', extra=d)
 

Здесь %(user) в формате относится к user ключу в extra дикте, предоставленном в logging.warning вызове. Если вы не укажете extra dict, то user для входа не будет никакого значения.