繁体   English   中英

Python 记录模块隔离记录器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM