【问题标题】:Python logging: override log timePython日志记录:覆盖日志时间
【发布时间】:2012-01-12 16:20:00
【问题描述】:

Python's documentation 之后,我试图覆盖 logging.Formatter.converter 以控制记录的时间。
如下所示 - 毫秒未被覆盖(它们是当前时间毫秒)。

怎么会?我怎样才能控制毫秒?

>>> import logging, datetime
>>> formatter = logging.Formatter('%(asctime)s:%(message)s')
>>> handler = logging.StreamHandler()
>>> handler.setFormatter(formatter)
>>> def sim_time(t):
...     return datetime.datetime(2000,1,2,3,4,5,678).timetuple()
...
>>> formatter.converter = sim_time
>>> log = logging.getLogger('test')
>>> log.addHandler(handler)
>>> log.info('hi')
2000-01-02 03:04:05,898:hi
>>> log.info('hi')
2000-01-02 03:04:05,914:hi
>>> log.info('hi')
2000-01-02 03:04:05,434:hi

【问题讨论】:

    标签: python logging time simulation milliseconds


    【解决方案1】:

    用这个覆盖logging.Formatter.formatTime()

    def sim_time(record, datefmt=None):
        return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]
    
    formatter.formatTime = sim_time
    

    如果您在此过程中的所有记录器都需要它,您可以覆盖类函数本身,但在您的代码遇到的第一个 import logging 语句之后执行此操作:

    def sim_time(self, record, datefmt=None):
        return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]
    
    import logging
    logging.Formatter.formatTime = sim_time
    

    【讨论】:

      【解决方案2】:

      timetuple()不使用毫秒,因此一旦调用该方法,datetime对象中包含的ms信息就会丢失:

      >>> d
      datetime.datetime(2000, 1, 2, 3, 4, 5, 678)
      >>> d.timetuple()
      time.struct_time(tm_year=2000, tm_mon=1, tm_mday=2, tm_hour=3, tm_min=4, tm_sec=5, tm_wday=6, tm_yday=2, tm_isdst=-1)
      

      请注意,这不是此特定方法的限制,而是time.struct_time type 的限制。

      底线是:如果您需要覆盖时间戳,请不要通过time.struct_time 对象。例如,您可以传递已经格式化为字符串的时间戳,而不是假时间。当然,根据您的需要,可能会有更好的方法!

      【讨论】:

        【解决方案3】:

        这是一个更好的示例,它允许您替换生成的时间,因为接受的答案并没有真正做到这一点。

        def inSimulatedTime(self,secs=None):
            global myTimeKeeper
            try:
               ts=myTimeKeeper.getCurrentTimeLocal() # returns a datetime.datetime object
               return ts.timetuple()
        except Exception as e:
            #sometimes my timekeeper hasn't been initialized yet.
            return time.localtime(secs)
        

        启用它:

        logging.Formatter.converter=inSimulatedTime
        

        【讨论】:

          猜你喜欢
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 2014-03-17
          • 2022-01-27
          • 1970-01-01
          • 1970-01-01
          • 2021-05-17
          • 1970-01-01
          相关资源
          最近更新 更多