请注意,除非您需要支持所有ISO 8601格式代码,否则
Craig McDaniel的解决方案更可取。
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
来修复,因为
ct
是一个
time.struct_time
对象,而这些对象不记录毫秒。
如果我们将
ct
的定义更改为使其成为
datetime
对象而不是
struct_time
,那么(至少在现代版本的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.')
或者,要获取毫秒数,请将逗号更改为小数点,并省略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.')
%f
在 Python 2.7.9 或 3.5.1 上都无法使用。 - Antony Hatchkinslogging
声称其默认时间格式遵循 ISO 8601。但实际并非如此。它使用空格而非 "T" 分隔时间,使用逗号而非小数点表示分数秒。他们怎么能搞错呢? - Mr. Lance E Sloan