Реализация Python Logger Class не распечатывает журналы - PullRequest
0 голосов
/ 12 февраля 2020

Я расширил класс логгера python, указанный ниже:

class CommonLogger(Logger):

    def debug(self, *args):
        self.check_and_log(10, args)

    def info(self, *args):
        self.check_and_log(20, args)

    def warn(self, *args):
        self.check_and_log(30, args)

    def error(self, *args):
        self.check_and_log(40, args)

    def check_and_log(self, level, args):
        if self.isEnabledFor(level):
            log_str = self.convert_list_to_string(args)
            super().log(level, log_str)

    @staticmethod
    def convert_list_to_string(args):
        return ''.join(str(msg) for msg in args)

И затем создал регистратор в каждом классе, который использует его следующим образом:

self.logger = CommonLogger(logging.getLogger(Constants.LOGGER_NAME))
self.logger.info('starting logger: ' + str(Constants.LOGGER_NAME))

Но когда я запускаю это, он не выдает ошибку - но он также не печатает никаких журналов на консоли. Любая идея, почему?

ОБНОВЛЕНИЕ: я сравнил это с нормальным потоком печати журнала - и похоже, что мои logging.handlers не инициализированы ( пустой список) внутри класса Logger, когда он создается как реализация класса Logger.

handlers = {list} <class 'list'> []

в то время как в обычном потоке - обработчики заполняются так:

handlers = {list} <class 'list'>: [<StreamHandler <stdout> (INFO)>, <RotatingFileHandler D:\y\logs\engine.log (INFO)>]
 0 = {StreamHandler} <StreamHandler <stdout> (INFO)>
 1 = {RotatingFileHandler} <RotatingFileHandler D:\y\logs\engine.log (INFO)>
 __len__ = {int} 2

Есть предложения?

1 Ответ

0 голосов
/ 12 февраля 2020

Это то, что в конечном итоге решило мою проблему:

class Message(object):
    def __init__(self, fmt, args):
        self.fmt = fmt
        self.args = args

    def __str__(self):
        return self.fmt + ''.join(str(arg) for arg in self.args)


class CommonLoggerAdapter(logging.LoggerAdapter):
    def __init__(self, logger, extra=None):
        super(CommonLoggerAdapter, self).__init__(logger, extra or {})

    def log(self, level, msg, *args, **kwargs):
        if self.isEnabledFor(level):
            msg, kwargs = self.process(msg, kwargs)
            self.logger._log(level, Message(msg, args), (), **kwargs)

Очевидно, использование реализации адаптера вместо реализации логгера работает лучше, так как logging.config совместно используется обоими. Если вы хотите использовать Реализацию Logger, то вам нужно сделать это во время инициализации:

def __init__(name):
    for handler in logging._handlers.values():
        self.addhandler(handler)

Обе эти опции работают! Надеюсь, это поможет и другим!

...