自定义Logger类python:如何使其跨类工作?

时间:2019-05-05 16:15:45

标签: python logging

我一直在玩一个自定义的记录器类,该类是我创建的,以便实现另一个“详细级别”(跟踪)。 我知道,根据logger类的文档不建议这样做-但是我有代码,为了进行广泛的调试,必须有代码。 那只蜜蜂说,我可以按预期使用所有方法(LOG.warning,LOG.trace等)调用记录器,但是当我尝试在另一个类中执行此操作时,它无法按预期运行。我猜记录器的属性由于某种原因而丢失了。

我基本上想要实现的是,我最初设置的属性(如日志格式,日志处理程序,日志级别等)保留在每个类中。

我有一个记录器类,它实现了“ TRACE”:

from logging import getLoggerClass, addLevelName, setLoggerClass, NOTSET


class AioLogger(getLoggerClass()) :
    TRACE = 1

    def __init__(self, name, level=NOTSET):
        super().__init__(name, level)

    addLevelName(TRACE, "TRACE")

    def trace(self, message, *args, **kwargs):
        if self.isEnabledFor(AioLogger.TRACE):
            self._log(AioLogger.TRACE, message, args, **kwargs)


setLoggerClass(AioLogger)

a类:

import logging
from AioLogger import AioLogger
from b import b

LOG = AioLogger(logging.getLogger('myapp'))
class a:
    def __init__(self):
        LOG.setLevel(AioLogger.TRACE)

        # create a file handler
        file_handler = logging.FileHandler('test.log')
        file_handler.setLevel(logging.DEBUG)
        file_formatter = logging.Formatter('[%(asctime)s] %(filename)-15s: line %(lineno)-5d: %(levelname)-8s: '
                                           '%(funcName)-50s: %(message)s')
        file_handler.setFormatter(file_formatter)
        LOG.addHandler(file_handler)

        # create console handler
        console_handler = logging.StreamHandler()
        console_handler.setLevel(AioLogger.TRACE)
        console_formatter = logging.Formatter('[%(asctime)s] %(filename)-15s: line %(lineno)-5d: %(levelname)-8s: '
                                              '%(funcName)-50s: %(message)s')
        console_handler.setFormatter(console_formatter)
        LOG.addHandler(console_handler)

        LOG.trace('trace')
        LOG.debug('debug')
        LOG.info('info')
        LOG.warning('warning')
        LOG.error('error')

b类:

import logging
from AioLogger import AioLogger

LOG = AioLogger(logging.getLogger('myapp'))
class b:
    def __init__(self):
        LOG.trace('trace')
        LOG.debug('debug')
        LOG.info('info')
        LOG.warning('warning')
        LOG.error('error')

在文件a的末尾添加以下内容:

ls = a()
cls2 = b()

并运行它,将产生以下输出:

[2019-05-05 18:03:19,908] a.py           : line 27   : TRACE   : __init__                                          : trace
[2019-05-05 18:03:19,908] a.py           : line 28   : DEBUG   : __init__                                          : debug
[2019-05-05 18:03:19,908] a.py           : line 29   : INFO    : __init__                                          : info
[2019-05-05 18:03:19,908] a.py           : line 30   : WARNING : __init__                                          : warning
[2019-05-05 18:03:19,908] a.py           : line 31   : ERROR   : __init__                                          : error
warning
error

由于某些原因,自定义记录器类的定义属性刚刚消失。我猜错误是在我的自定义记录器类中的某个地方,因为通过logging.getlogger('myapp')获取“默认”记录器的效果很好-但它没有提供所需的TRACE日志级别(因此,自定义记录器类,顺便说一句我在stackoverflow上找到了某个地方。

0 个答案:

没有答案