Ошибка регистрационного ключа при использовании «extra»

1

У меня простая настройка регистрации:

extra = {'hostname': socket.gethostname(), 'ip': socket.gethostbyname(socket.gethostname()), 'user': getpass.getuser()}


def get_logger():
    logging.basicConfig(
        format='%(asctime)s # %(user)s # %(hostname)s # %(ip)s # %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S')

    crawler_logger = logging.getLogger("crawler")
    crawler_logger.setLevel(logging.INFO)
    crawler_logger = logging.LoggerAdapter(crawler_logger, extra)
    return crawler_logger

И я использую эту настройку во всех моих журналах. Некоторые примеры:

logger.warning("Harmful URL # Potentially harmful url # %s" % url["url"])

logger.info("URL already exists: %s ", url_dict["url"])

logger.error("ERROR # ERROR while crawling url. %s" % e)

Но всякий раз, когда возникает ошибка из любой из библиотек, которые я использую (например, aiokafka), мой код генерирует " Logging Error " с KeyError: "пользователь", хотя ключ "user" существует и оценивается в дополнительном словаре.

Столбец ошибки:

--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.6/logging/__init__.py", line 992, in emit
    msg = self.format(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 838, in format
    return fmt.format(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 578, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 547, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 391, in format
    return self._fmt % record.__dict__
KeyError: 'user'

Я не мог найти никаких решений, поэтому прошу здесь.

Теги:
python-3.x
logging

1 ответ

1
Лучший ответ

Исправлено установкой форматера Logger только для моих собственных регистраторов, прежде чем я (неосознанно) установил формат регистратора для всех регистраторов следующим образом:

logging.basicConfig(
        format='%(asctime)s # %(user)s # %(hostname)s # %(ip)s # %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S')

Фиксированная версия:

extra = {'hostname': socket.gethostname(), 'ip': socket.gethostbyname(socket.gethostname()), 'user': getpass.getuser()}


def get_logger():
    app_logger = logging.getLogger(__name__)
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s # %(user)s # %(hostname)s # %(ip)s # %(message)s',
    datefmt='%d/%m/%Y %I:%M:%S')
    handler.setFormatter(formatter)
    app_logger.addHandler(handler)
    app_logger.setLevel(logging.INFO)
    app_logger = logging.LoggerAdapter(app_logger, extra)
    return app_logger

Ещё вопросы

Сообщество Overcoder
Наверх
Меню