在 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
答案 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