Python Logging.Logger: переопределение makeRecord - PullRequest
0 голосов
/ 12 июня 2018

У меня есть средство форматирования, которое ожидает специальный атрибут в записи "user_id", который не всегда существует (иногда я добавляю его в записи, используя специальный logging.Filter).Я попытался переопределить метод ведения журнала makeRecord.Logger примерно так:

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)-15s user_id=%(user_id)s %(filename)s:%(lineno)-15s: %(message)s')


class OneTestLogger(logging.Logger):
    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):
        rv = logging.Logger.makeRecord(self, name, level, fn, lno,
                                       msg, args, exc_info,
                                       func, extra)
        rv.__dict__.setdefault('user_id', 'master')
        return rv


if __name__ == '__main__':

    logger = OneTestLogger('main')
    print logger
    logger.info('Starting test')

Но, похоже, это не работает, и я продолжаю получать:

<<strong> main .MyLogger instance at 0x7f31a6a5b638>

Не удалось найти обработчики для регистратора "main"

Что я делаю не так?Спасибо.

1 Ответ

0 голосов
/ 31 мая 2019

В соответствии с указаниями, приведенными в Ведение журнала поваренной книги .Только в первой части я не реализовал Filter (который также не указан в приведенной ниже цитате).

Обычно это означает, что если вам нужно сделать что-то особенное с LogRecord, выпришлось выполнить одно из следующих действий.

  1. Создайте свой собственный подкласс Logger, который переопределяет Logger.makeRecord (), и установите его с помощью setLoggerClass () до того, как будут созданы все необходимые вам регистраторы.

Я упростил ваш пример, просто добавив 'hostname':

import logging
from socket import gethostname

logging.basicConfig(level=logging.DEBUG,
                            format='%(asctime)s - %(hostname)s - %(message)s')

class NewLogger(logging.Logger):
    def makeRecord(self, *args, **kwargs):
        rv = super(NewLogger, self).makeRecord(*args, **kwargs)
        # updating the rv value of the original makeRecord
        # my idea is to use the same logic than a decorator by
        # intercepting the value return by the original makeRecord
        # and expanded with what I need
        rv.__dict__['hostname'] = gethostname()
        # by curiosity I am checking what is in this dictionary
        # print(rv.__dict__)
        return rv

logging.setLoggerClass(NewLogger)

logger = logging.getLogger(__name__)
logger.info('Hello World!')

Обратите внимание, что этот код работает на python 2.7

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