首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >示例日志生成python日志库

示例日志生成python日志库
EN

Stack Overflow用户
提问于 2022-06-02 08:56:12
回答 1查看 100关注 0票数 1

我想试一下我从服务中发送的日志数量,因为它有相当多的流量。假设我想使用python的标准日志库为10%的请求发送日志。是否有一种本机/优雅的方法来将此决定集中到所有记录器上?我认为根记录器中的某种配置可能会完成这项工作,但不确定是如何完成的。

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2022-06-02 09:39:20

解决这个问题有很多种方法。就我个人而言,我喜欢创建我自己的Logger类,我调用它来记录,而不是直接调用标准日志库。在尝试更改或添加任何功能时,它提供了更多的自由,您可以将其集中在一个地方;而不必在每个文件或请求处理程序中进行更改。如果这样做,还可以向某些日志行添加可选参数,例如日志记录的频率(或概率)。

但是,您也可以根据您的要求调整标准日志记录,以完成这一任务。为了清楚起见,我将提供这两种选择:

选项1:使用Python的日志库

在这里,我们为Python的记录器添加了一个过滤器(谢谢您的建议)

代码语言:javascript
复制
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))

对于这个解决方案,有一些注意事项:

  • --您将不得不将此添加到您想要添加此功能的每个处理程序中,可能会导致大量更改。
  • 从您刚才提到的,您希望记录您正在接收的请求。如果将此处理程序应用于记录器,它将记录它接收到的所有消息的10%。这包括来自同一个记录器的其他消息,您可能总是想要记录这些消息,而不是.

选项2:使用您自己的自定义记录器

代码语言:javascript
复制
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)

一开始,您可能需要替换所有的记录器,但是这种封装为您提供了更大的灵活性,可以在将来添加或删除任何您想添加或删除的参数。

希望这能帮上忙,祝你今天过得愉快!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72473438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档