python日志系统的速率限制过滤器
ratelimitingfilter的Python项目详细描述
RateLimitingFilter是python日志系统的过滤器 它允许您限制消息可以通过的速率 你的日志处理程序。
如果您使用的是python这样的处理程序,那么过滤器可能很有用 logging.handlers.SMTPHandler发送错误通知电子邮件。 错误通知电子邮件提供了监视 运行系统的健康状况,但这些电子邮件有可能 如果由于以下原因而开始连续快速到达,则会使邮箱过载 某种严重的失败
RateLimitingFilter有助于防止邮箱过载 基于可配置速率限制消息,同时允许 周期性的信息爆发可以作为一个有用的指示器 有什么东西坏了。
相容性
- Python2.7,3.4+
安装
$ pip install ratelimitingfilter
或
$ git clone https://github.com/wkeeling/ratelimitingfilter.git $ cd ratelimitingfilter $ python setup.py install
用法
只需创建 RateLimitingFilter并将其添加到处理程序:
fromratelimitingfilterimportRateLimitingFilter...ratelimit=RateLimitingFilter()handler.addFilter(ratelimit)
创建不带任何参数的RateLimitingFilter的实例 在上面的例子中,将消息流限制为 30秒
您可以通过为 rate、per和burst属性。例如,允许 每2分钟发送一条消息,周期性突发消息多达5条:
ratelimit=RateLimitingFilter(rate=1,per=120,burst=5)handler.addFilter(ratelimit)
SMTPHandler示例
典型的用例可能是限制由发送的错误通知电子邮件 logging.handlers.SMTPHandler。
下面是一个如何设置的示例:
importlogging.handlersimporttimefromratelimitingfilterimportRateLimitingFilterlogger=logging.getLogger('throttled_smtp_example')# Create an SMTPHandlersmtp=logging.handlers.SMTPHandler(mailhost='smtp.example.com',fromaddr='from@example.com',toaddrs='to@example.com',subject='An error has occurred')smtp.setLevel(logging.ERROR)# Create a formatter and set it on the handlerformatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')smtp.setFormatter(formatter)# Create an instance of the RateLimitingFilter, and add it to the handlerratelimit=RateLimitingFilter()smtp.addFilter(ratelimit)# Add the handler to the loggerlogger.addHandler(smtp)# Logged errors will now be restricted to 1 every 30 secondswhileTrue:logger.error('An error message')time.sleep(2)
高级用法
可以向 RateLimitingFilter用于进一步控制消息的初始值设定项 节流
也许您希望有选择地限制特定的错误消息 同时允许其他信息自由传递。这可能是 如果您知道应用程序的一部分可以生成 大量错误,而应用程序的其余部分不太可能 到。
实现这一点的一种方法可能是使用单独的记录器,配置一个 有速率限制,一个不带,用于 申请或者,您可以使用单个记录器并配置 RateLimitingFilter只匹配那些您想要的消息 节流阀。
应用选择性的速率限制允许低 卷错误,同时保持较高的卷错误检查。
RateLimitingFilter支持两种有选择地限制 消息:
基于子字符串的消息限制
您可以将子字符串列表传递给它所在的RateLimitingFilter。 将用于匹配要应用于的邮件。
config={'match':['some error','a different error']}ratelimit=RateLimitingFilter(rate=1,per=60,burst=1,**config)smtp.addFilter(ratelimit)# Can be rate limitedlogger.error('some error occurred')# Can be rate limitedlogger.error('a different error occurred')# Will not be rate limitedlogger.error('something completely different happened')
自动消息限制
这是一个实验特性。
您可以让RateLimitingFilter自动限制消息 通过将match选项设置为auto。
config={'match':'auto'}ratelimit=RateLimitingFilter(rate=1,per=60,burst=1,**config)
然后,筛选器将尝试根据消息的内容识别消息 为了弄清楚是否要限制他们。它会容忍 识别信息时内容略有不同。例如, 如果错误信息被快速记录,则除了 时间戳,或者可能是递增的id,那么这些消息将是 就速率限制而言被视为相同的。
许可证
麻省理工学院