gpt4 book ai didi

python - 如何限制相同日志消息的数量?

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:00 26 4
gpt4 key购买 nike

我使用 logging模块警告一些例程的问题。在恢复正常操作之前,这些例程可能会运行多次(例如,重复查询失败但最终通过的 API)。每个失败的调用都会触发一个日志条目。

有没有办法限制相同日志消息的数量?
我希望在输出 n 相同的消息后触发此限制,然后可能会通知生成了更多的 n (以免使日志文件困惑)并重置一次收到恢复日志。这是理想情况 - 我正在研究如何着手解决问题。

我找到的最接近的是 conditional release of logs但我看不出这如何适用于我的情况。
另一种可能性是将限制放在系统日志级别(在 rsyslogsyslog-ng 中)但这是一个“每个进程”设置,所以我可能会丢失有用的日志(那些会介于循环生成的之间的)

最佳答案

使用logging.Filter!

DuplicateFilter 采用两个正则表达式模式或一个字符串(将被编译成一个),一个应该与您要过滤掉的字符串相匹配,一个是您要重置过滤器的字符串。

import logging
import os
import re
import sys

from sre_parse import Pattern


class DuplicateFilter(logging.Filter):
def __init__(self, match_against, reset_at_message, hide_at_count=5, name=''):
super(DuplicateFilter, self).__init__(name)

if isinstance(match_against, Pattern):
self.match_against = match_against
else:
self.match_against = re.compile(match_against)

if isinstance(reset_at_message, Pattern):
self.reset_at_message = reset_at_message
else:
self.reset_at_message = re.compile(reset_at_message)

self.hide_at_count = hide_at_count

self.count = 0

def filter(self, record: logging.LogRecord):
_ = super(DuplicateFilter, self).filter(record)
if not _:
return _

msg = record.getMessage()

if self.match_against.match(msg):
self.count += 1

if self.count >= self.hide_at_count:
return False

elif self.reset_at_message.match(msg):
record.msg = os.linesep.join([
'{:d} more generated'.format(self.count - self.hide_at_count),
record.msg
])
self.count = 0

return True

handler = logging.StreamHandler(sys.stdout)
handler.addFilter(DuplicateFilter('Filter me!', 'Reset at me'))

logging.basicConfig(level='INFO', handlers=[handler, ])

log = logging.getLogger()

for _ in range(10):
log.info('Filter me!')

log.info('Reset at me')

for _ in range(3):
log.info('Filter me!')

这是生成的日志:

INFO:root:Filter me!
INFO:root:Filter me!
INFO:root:Filter me!
INFO:root:Filter me!
INFO:root:5 more generated
Reset at me
INFO:root:Filter me!
INFO:root:Filter me!
INFO:root:Filter me!

仅仅在“5 more generated”消息之前添加可能不是您想要的,但希望这是一个很好的起点。

关于python - 如何限制相同日志消息的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33675545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com