Python日志logging:在时间格式中使用毫秒

默认情况下, logging.Formatter('%(asctime)s')使用以下格式打印:

 2011-06-09 10:54:40,638 

其中638是毫秒。 我需要把逗号改成一个点:

 2011-06-09 10:54:40.638 

格式化我可以使用的时间:

 logging.Formatter(fmt='%(asctime)s',datestr=date_format_str) 

但是文档没有指定如何格式化毫秒。 我发现这个问题谈到了几微秒,但是a)我更喜欢毫秒和b)由于%f ,以下不能在Python 2.6(我工作)上工作:

 logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f') 

请注意克雷格麦克丹尼尔的解决scheme显然是更好的。


logging.Formatter的formatTime方法如下所示:

 def formatTime(self, record, datefmt=None): ct = self.converter(record.created) if datefmt: s = time.strftime(datefmt, ct) else: t = time.strftime("%Y-%m-%d %H:%M:%S", ct) s = "%s,%03d" % (t, record.msecs) return s 

注意"%s,%03d"的逗号。 这不能通过指定datefmt来解决,因为cttime.struct_time并且这些对象不logging毫秒。

如果我们改变ct的定义使其成为datetime对象而不是struct_time ,那么(至less在现代版本的Python中)我们可以调用ct.strftime ,然后我们可以使用%f来格式化微秒:

 import logging import datetime as dt class MyFormatter(logging.Formatter): converter=dt.datetime.fromtimestamp def formatTime(self, record, datefmt=None): ct = self.converter(record.created) if datefmt: s = ct.strftime(datefmt) else: t = ct.strftime("%Y-%m-%d %H:%M:%S") s = "%s,%03d" % (t, record.msecs) return s logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) console = logging.StreamHandler() logger.addHandler(console) formatter = MyFormatter(fmt='%(asctime)s %(message)s',datefmt='%Y-%m-%d,%H:%M:%S.%f') console.setFormatter(formatter) logger.debug('Jackdaws love my big sphinx of quartz.') # 2011-06-09,07:12:36.553554 Jackdaws love my big sphinx of quartz. 

或者,要获得毫秒,请将逗号更改为小数点,并省略datefmt参数:

 class MyFormatter(logging.Formatter): converter=dt.datetime.fromtimestamp def formatTime(self, record, datefmt=None): ct = self.converter(record.created) if datefmt: s = ct.strftime(datefmt) else: t = ct.strftime("%Y-%m-%d %H:%M:%S") s = "%s.%03d" % (t, record.msecs) return s ... formatter = MyFormatter(fmt='%(asctime)s %(message)s') ... logger.debug('Jackdaws love my big sphinx of quartz.') # 2011-06-09 08:14:38.343 Jackdaws love my big sphinx of quartz. 

这也应该工作:

 logging.Formatter(fmt='%(asctime)s.%(msecs)03d',datefmt='%Y-%m-%d,%H:%M:%S') 

在实例化Formatter我通常会设置formatter.converter = gmtime 。 所以为了让@ unutbu的答案在这种情况下工作,你需要:

 class MyFormatter(logging.Formatter): def formatTime(self, record, datefmt=None): ct = self.converter(record.created) if datefmt: s = time.strftime(datefmt, ct) else: t = time.strftime("%Y-%m-%d %H:%M:%S", ct) s = "%s.%03d" % (t, record.msecs) return s 

我发现最简单的方法是重写default_msec_format:

 formatter = logging.Formatter('%(asctime)s') formatter.default_msec_format = '%s.%03d'