Могу ли я расширить класс Logger без изменения имени зарегистрированного модуля / имени функции / номера строки? - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу избежать написания кода типа logger.debug(msg, extra=self.extra).До сих пор я пытался сделать это двумя способами (расширение Logger и декораторы), но ни один из них не увенчался успехом.

Если я расширяю класс Logger и реализую такие методы, как debug, следующим образом:

def debug(self, msg, *args, **kwargs):
    self._update_kwargs(**kwargs)
    super(ExtendedLogger, self).debug(msg, *args, **kwargs)

Имя модуля / функции / номер строки, которые регистрируются, являются не сайтами вызовов ExtendedLogger.debug, а вызовом super(ExtendedLogger, self).debug(msg, *args, **kwargs);т.е. они всегда одинаковые значения.У меня та же проблема, если я пытаюсь реализовать нечто подобное с помощью декораторов.

Я понимаю, что это связано с вызовом findCaller в _log в этом файле: https://github.com/python/cpython/blob/2.7/Lib/logging/init.py (R.1284).Возможно ли зарегистрировать эти дополнительные данные, не вставляя копию Logger и слегка его настраивая?

1 Ответ

0 голосов
/ 24 декабря 2018

Кажется, что это точная цель, для которой существует LoggerAdapter:

LoggerAdapter экземпляры используются для удобной передачи контекстной информации в журналы вызовов.

Вам может даже не понадобиться создавать подклассы, просто используйте LoggerAdapter напрямую:

logger = logging.getLogger(__name__)
logger = logging.LoggerAdapter(logger, extra={'extra_key': 'extra_value'})

Если вы хотите предоставить дополнительные значения динамически, вы можете легко просто создать подкласс LoggerAdapter ипереопределите его метод process, чтобы добавить дополнительные значения ко всем методам ведения журнала.

Это позволяет избежать необходимости переопределять все методы ведения журнала на уровне уровня (debug, info, warning и т. д.) итакже приятно обойти проблему findCaller одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...