Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python日志模块实现一个日志_Python_Logging - Fatal编程技术网

用python日志模块实现一个日志

用python日志模块实现一个日志,python,logging,Python,Logging,我正在尝试创建一个python记录器处理程序,它可以很好地处理计数。例如,我可能每秒对某个东西进行1000次logging.debug。比如说,10秒后,我想记录下这件事在这10秒内发生了10000次的事实。我已经做了一些准备,但它似乎有点恶心,我想知道是否有python日志专家可以帮忙。理想情况下,我希望我的理货处理程序定期将理货记录传递给标准处理程序 以下是我目前掌握的情况: class CounterHandler(logging.Handler): ''' This handle

我正在尝试创建一个python记录器处理程序,它可以很好地处理计数。例如,我可能每秒对某个东西进行1000次logging.debug。比如说,10秒后,我想记录下这件事在这10秒内发生了10000次的事实。我已经做了一些准备,但它似乎有点恶心,我想知道是否有python日志专家可以帮忙。理想情况下,我希望我的理货处理程序定期将理货记录传递给标准处理程序

以下是我目前掌握的情况:

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平均数量


要编写此处理程序,您可以基于

您可以展示问题的另一面吗?也就是说,您在其中使用的代码具有预期的行为?