用python日志模块实现一个日志
我正在尝试创建一个python记录器处理程序,它可以很好地处理计数。例如,我可能每秒对某个东西进行1000次logging.debug。比如说,10秒后,我想记录下这件事在这10秒内发生了10000次的事实。我已经做了一些准备,但它似乎有点恶心,我想知道是否有python日志专家可以帮忙。理想情况下,我希望我的理货处理程序定期将理货记录传递给标准处理程序 以下是我目前掌握的情况:用python日志模块实现一个日志,python,logging,Python,Logging,我正在尝试创建一个python记录器处理程序,它可以很好地处理计数。例如,我可能每秒对某个东西进行1000次logging.debug。比如说,10秒后,我想记录下这件事在这10秒内发生了10000次的事实。我已经做了一些准备,但它似乎有点恶心,我想知道是否有python日志专家可以帮忙。理想情况下,我希望我的理货处理程序定期将理货记录传递给标准处理程序 以下是我目前掌握的情况: class CounterHandler(logging.Handler): ''' This handle
class CounterHandler(logging.Handler):
'''
This handler is to log only counts of messages.
So, for instance, suppose we want to logging.debug event A
which happens about once a millisecond, but we may want to
logging.info every second how many times event A happened
during that second.
'''
def __init__(self, pattern, message, logger, howoften = 1, timer = time.time, leastlevel = logging.NOTSET, messagelevel = logging.INFO, plot = False):
'''
pattern: the regex pattern in log messages to count
leastlevel: the least logging level to count
handler: the handler to hand accumulated counts to
message: the message to log when we log accumulated counts
messagelevel: the logging level at which to log accumulated counts
howoften: how often to log accumulated counts
timer: the timer to use (default is real time, but you can use, e.g. simpy time or something else)
'''
logging.Handler.__init__(self)
self._regex = re.compile(pattern)
self._msg = message
self._messagelevel = messagelevel
self._leastlevel = level
self._logger = logger
self._count = 0
self._howoften = howoften
self._timer = timer
self.stopper = threading.Event()
self._propogation_thread = threading.Thread(target=self._propogate, args=(self.stopper, timer))
self._propogation_thread.daemon = True
self._propogation_thread.start()
def _dump(self):
self._logger.log(self._messagelevel,
"{} happened {} times by time {}".format(self._msg,
self._count,
self._timer()))
def _propogate(self, stopper, timer):
'''
This is a thread that dumps the counts every so often
'''
lasttime = timer()
while not stopper.is_set():
if lasttime + self._howoften < timer():
self._dump()
def emit(self, record):
if record.level >= self._level and regex.match(record.message):
self._count += 1
编辑:
@罗特,这个问题的另一面其实很复杂。我想把它交给另一个处理程序的原因是,我想在处理我得到的计数时具有灵活性。我有一个实时计算图形的模块,但我也有一个日志文件,可以输出到其中。在这种情况下,我似乎应该按照链接处理程序的思路来做一些事情,然后我可以添加或删除我认为合适的功能。即:
The big picture:
,-> LogFileHandler
My Code -> Log Message -> Logger -> LogRecord < ,-> GrapherHandler
`-> CounterHandler <
`-> LogFileHandler
在我看来,更容易的是在log.debug发生1000次之后发送log.info的写处理程序。在日志中,您有datetime,因此可以计算每秒钟、每分钟、每小时的log.debug平均数量
要编写此处理程序,您可以基于您可以展示问题的另一面吗?也就是说,您在其中使用的代码具有预期的行为?