Python 日志模块隔离记录器

时间:2021-04-14 20:41:35

标签: python logging

在 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

1 个答案:

答案 0 :(得分: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