[英]Python logging module isolate loggers
在 Rest API 服务器中,我使用日志记录模块记录脚本运行并将结果发送给客户端。 我正在使用带有文件全局处理程序和单个 stream 处理程序的日志记录。 Http 响应取决于记录器中的错误数量和关键问题。 为了计算记录器和错误,我使用了自定义版本的记录器。
受这篇文章的启发,我编写了以下代码来计算方法被调用的次数
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
它不起作用,因为为此使用装饰器是一种可怕的日志计数方式。 如果有人使用log1.log(logging.INFO, "INFO 1")
而不是使用便捷的快捷方式来写日志怎么办?
这是一种更好的方法,这也是 python 文档建议执行此类操作的方式:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.