gpt4 book ai didi

python - 自定义记录器类 python : How to make it work across classes?

转载 作者:行者123 更新时间:2023-12-05 07:23:29 24 4
gpt4 key购买 nike

我一直在研究自定义记录器类,我创建该类是为了实现另一个“详细级别”(即跟踪)。我知道,根据记录器类的文档不推荐这样做——但是我有代码,必须有它才能进行广泛的调试。那个蜜蜂说,我可以按预期使用所有方法(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)

甲类:

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 日志级别(因此自定义记录器类,BTW我在 stackoverflow 的某处找到了)。

最佳答案

Logger 类不是单例。在 a 类中,您调用 LOG = AioLogger(logging.getLogger('myapp'))这将返回 AioLogger 的实例,而不是类。因此,在后续代码中,您自定义的是该实例,而不是类。

如果您希望 AioLogger 拥有这些处理程序和格式化程序,则必须在类中将其定义为类的属性。然后,每次实例化它时,所有这些属性都会被带走。

关于python - 自定义记录器类 python : How to make it work across classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55993971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com