Python日志系统的速率限制过滤器
项目描述
RateLimitingFilter 是一个针对 Python 日志系统的过滤器,它允许您限制消息通过日志处理器传递的速率。
如果您正在使用类似于 Python 的 logging.handlers.SMTPHandler 的处理器来发送错误通知电子邮件,那么该过滤器可能很有用。错误通知电子邮件是监视运行系统健康的有用手段,但这些电子邮件可能会因为某种关键故障而连续到达,从而有可能使邮箱过载。
通过基于可配置速率节流消息,RateLimitingFilter 可以帮助防止邮箱过载,同时允许周期性地爆发消息,这可能是某个地方出现问题的有用指示。
兼容性
Python 2.7, 3.4+
安装
$ pip install ratelimitingfilter
或
$ git clone https://github.com/wkeeling/ratelimitingfilter.git $ cd ratelimitingfilter $ python setup.py install
使用
您可以通过创建一个 RateLimitingFilter 的新实例并将其添加到处理器中来对日志处理器进行速率限制
from ratelimitingfilter import RateLimitingFilter
...
ratelimit = RateLimitingFilter()
handler.addFilter(ratelimit)
在上面的例子中,创建一个没有任何参数的 RateLimitingFilter 实例将限制每30秒传递一条消息。
您可以通过为rate、per和burst属性提供自己的值来自定义流量速率。例如,允许每2分钟发送1条消息,并允许周期性爆发最多5条消息。
ratelimit = RateLimitingFilter(rate=1, per=120, burst=5)
handler.addFilter(ratelimit)
SMTPHandler 示例
一个典型的用例可能是限制由logging.handlers.SMTPHandler发送的错误通知电子邮件。
以下是如何设置它的一个示例
import logging.handlers
import time
from ratelimitingfilter import RateLimitingFilter
logger = logging.getLogger('throttled_smtp_example')
# Create an SMTPHandler
smtp = 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 handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
smtp.setFormatter(formatter)
# Create an instance of the RateLimitingFilter, and add it to the handler
ratelimit = RateLimitingFilter()
smtp.addFilter(ratelimit)
# Add the handler to the logger
logger.addHandler(smtp)
# Logged errors will now be restricted to 1 every 30 seconds
while True:
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 limited
logger.error('some error occurred')
# Can be rate limited
logger.error('a different error occurred')
# Will not be rate limited
logger.error('something completely different happened')
自动消息节流
这是一个实验性功能.
您可以将match选项设置为auto,让RateLimitingFilter自动节流消息。
config = {'match': 'auto'}
ratelimit = RateLimitingFilter(rate=1, per=60, burst=1, **config)
然后,过滤器将尝试根据消息内容来识别消息,以确定是否要节流它们。它在识别消息时可以容忍内容上的轻微差异。例如,如果错误消息正在快速记录,除了时间戳外都相同,或者可能是一个递增的ID,那么这些消息在速率限制方面将被视为相同。
许可证
MIT
贡献
欢迎反馈和改进。请提交拉取请求!