我想试一下我从服务中发送的日志数量,因为它有相当多的流量。假设我想使用python的标准日志库为10%的请求发送日志。是否有一种本机/优雅的方法来将此决定集中到所有记录器上?我认为根记录器中的某种配置可能会完成这项工作,但不确定是如何完成的。
提前谢谢你!
发布于 2022-06-02 09:39:20
解决这个问题有很多种方法。就我个人而言,我喜欢创建我自己的Logger类,我调用它来记录,而不是直接调用标准日志库。在尝试更改或添加任何功能时,它提供了更多的自由,您可以将其集中在一个地方;而不必在每个文件或请求处理程序中进行更改。如果这样做,还可以向某些日志行添加可选参数,例如日志记录的频率(或概率)。
但是,您也可以根据您的要求调整标准日志记录,以完成这一任务。为了清楚起见,我将提供这两种选择:
选项1:使用Python的日志库
在这里,我们为Python的记录器添加了一个过滤器(谢谢您的建议)
import logging
from random import SystemRandom
class ProbabilityFilter(logging.Filter):
probability = 0.10
cryptogen = SystemRandom()
def filter(self, record):
return self.cryptogen.random() < self.probability
logger = logging.getLogger('test_logger')
logger.setLevel('INFO')
logger.addFilter(ProbabilityFilter())
logger.addHandler(logging.StreamHandler())
for i in range(100):
logger.info("Logging number: {}".format(i))对于这个解决方案,有一些注意事项:
选项2:使用您自己的自定义记录器
from random import SystemRandom
import logging
class MyAppLogger:
def __init__(self, logger_name: str):
self.logger = logging.getLogger(logger_name)
self.logger.setLevel("INFO")
self.logger.addHandler(logging.StreamHandler())
self.cryptogen = SystemRandom()
def info(self, message: str, probability: float = 1.0):
"""Logs a message at an INFO level.
:param message: The logging message to print.
:type message: str
:param probability: The chance of logging the message. Always log
by default.
:type probability: float, optional
"""
# Checks the probability first to avoid the cost of generating
# a random number if avoidable
if probability == 1.0 or self.cryptogen.random() < probability:
self.logger.info(message)
logger = MyAppLogger('test_logger')
# By default, log everything
for i in range(5):
logger.info("Definitely logging number: {}".format(i))
# Logging with a probability, with the same logger
for i in range(100):
logger.info("Possibly logging number: {}".format(i), probability=0.1)一开始,您可能需要替换所有的记录器,但是这种封装为您提供了更大的灵活性,可以在将来添加或删除任何您想添加或删除的参数。
希望这能帮上忙,祝你今天过得愉快!
https://stackoverflow.com/questions/72473438
复制相似问题