【问题标题】:Python logging module isolate loggersPython 日志记录模块隔离记录器
【发布时间】:2021-04-14 20:41:35
【问题描述】:

在一个 Rest API 服务器中,我正在使用日志记录模块来记录脚本运行并将结果发送给客户端。我正在使用带有文件全局处理程序和单个流处理程序的日志记录。 Http 响应取决于记录器中的错误和关键数量。 为了计算记录器和错误,我使用了自定义版本的记录器。

灵感来自post 我写了下面的代码来计算一个方法被调用的次数

def init_logger(lid: str):
    log = MyLogger(str(lid))
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    log.addHandler(ch)
    log.setLevel(logging.DEBUG)
    return log

问题是,如果我用不同的 id 初始化两个不同的记录器,计数会重叠,如下所示

log1 = init_logger(1)
log2 = init_logger(2)
log1.info("INFO 1")
print(log2.info.called) -->1

【问题讨论】:

    标签: python logging


    【解决方案1】:

    它不起作用,因为为此使用装饰器是一种可怕的日志计数方式。如果有人使用log1.log(logging.INFO, "INFO 1") 而不是使用便捷的快捷方式来写日志怎么办?

    这里有一个更好的方法,这也是python documentation 建议做这些事情的方式:

    import logging
    from collections import Counter
    
    def counting_filter(record):
        logger = logging.getLogger(record.name)
        logger.counter[record.levelno] += 1
        return True
    
    def init_logger(lid):
        log = logging.getLogger(str(lid))
        log.counter = Counter() # <-- added this line, but count could be stored anywhere
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        log.addHandler(ch)
        log.setLevel(logging.DEBUG)
        log.addFilter(counting_filter) # <-- added Filter here
        return log
    
    log1 = init_logger(1)
    log2 = init_logger(2)
    
    log1.info("info 1")
    
    print(log1.counter[logging.INFO]) # 1
    print(log2.counter[logging.INFO]) # 0
    

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 2017-06-04
      • 2011-11-29
      • 2021-11-23
      • 2020-08-11
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多