基于日志记录级别的不同实例repr

2024-09-29 19:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想记录一些实例的信息。但是,我希望根据我使用的日志级别显示不同级别的详细信息。例如:

LOGGER.level
# => 20
LOGGER.info('Car info: %s', Car())
# => [INFO]: Car info: Celica
LOGGER.setLevel(logging.DEBUG)
LOGGER.info('Car info: %s', Car())
# => [INFO]: Car info: {'name': 'Celica', 'year': 1998, 'model': 'GT-Four'}

到目前为止,我得出了如下结论:

import logging

LOGGER = logging.getLogger()
logging.basicConfig(
    format='[%(levelname)s]: %(message)s',
    level=logging.INFO)
    
class Car:
    def __init__(self):
        self.name = 'Celica'
        self.year = 1998
        self.model = 'GT-Four'

    def __repr__(self):
        if LOGGER.level == logging.DEBUG:
            return str(self.__dict__)
            
        return f'{self.name}'

我觉得这有点过于“定制”和硬编码。在{}中使用{}或{}感觉有点奇怪。这是正确的方法,还是有更好的方法


Tags: namedebuggtselfinfomodellogginglogger
1条回答
网友
1楼 · 发布于 2024-09-29 19:18:47

是的,这在__repr__中是不寻常的逻辑——正如您所识别的,可能是代码气味。通常,表示逻辑将放在Formatter子类中,但也可以放在filter中。下面是一个简单的工作示例;您应该能够将基本想法调整为更一般的方案:

import logging

LOGGER = logging.getLogger()

class Car:
    def __init__(self):
        self.name = 'Celica'
        self.year = 1998
        self.model = 'GT-Four'

def filter(record):
    if record.args:
        args = []
        for arg in record.args:
            if isinstance(arg, Car):
                if record.levelno == logging.DEBUG:
                    arg = str(arg.__dict__)
                else:
                    arg = arg.name
            args.append(arg)
        record.args = tuple(args)
    return True

def main():
    LOGGER.setLevel(logging.DEBUG)
    f = logging.Formatter('[%(levelname)-5s]: %(message)s')
    h = logging.StreamHandler()
    h.setFormatter(f)
    LOGGER.addHandler(h)
    LOGGER.addFilter(filter)
    car = Car()
    LOGGER.info('basic : %s', car)
    LOGGER.debug('detail: %s', car)
    LOGGER.debug('no car in this %s', 'message')
    LOGGER.debug('nor in this one')

if __name__ == '__main__':
    main()

运行时,上述脚本将打印:

[INFO ]: basic : Celica                                              
[DEBUG]: detail: {'name': 'Celica', 'year': 1998, 'model': 'GT-Four'}
[DEBUG]: no car in this message                                      
[DEBUG]: nor in this one                                             

相关问题 更多 >

    热门问题