默认情况下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)
但是,文档没有指定如何格式化毫秒。我发现了这个SO问题,它谈论的是微秒,但是a)我更喜欢毫秒,b)由于%f,下面的问题在Python 2.6(我正在工作)上不起作用:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
实例化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
使用这个智能答案的时区和选择的答案,你可以用你想要的格式构建毫秒和时区:
import logging
import time
if __name__ == "__main__":
tz = time.strftime('%z')
logging.basicConfig(
format=(
"%(asctime)s.%(msecs)03d" + tz + " %(levelname)s "
"%(pathname)s:%(lineno)d[%(threadName)s]: %(message)s"
),
level=logging.DEBUG,
datefmt="%Y-%m-%dT%H:%M:%S",
)
logging.info("log example")
就我个人而言,我喜欢以UTC格式保存所有日志,但在日志中显式地将其作为没有时区的datetime,这在多区域应用程序中是没有意义的:
logging.Formatter.converter = time.gmtime
logging.basicConfig(
format=(
"%(asctime)s.%(msecs)03d+0000 %(levelname)s "
"%(pathname)s:%(lineno)d[%(threadName)s]: %(message)s"
),
level=logging.DEBUG,
datefmt="%Y-%m-%dT%H:%M:%S",
)
这里有许多过时的、过于复杂和奇怪的答案。原因是文档是不充分的,简单的解决方案是使用basicConfig(),并设置如下:
logging.basicConfig(datefmt='%Y-%m-%d %H:%M:%S', format='{asctime}.{msecs:0<3.0f} {name} {threadName} {levelname}: {message}', style='{')
这里的技巧是,你还必须设置datefmt参数,因为默认的参数会把它弄乱,并且不是(目前)在python指南文档中显示的内容。所以还是看这里吧。
另一种可能更干净的方法是覆盖default_msec_format变量:
formatter = logging.Formatter('%(asctime)s')
formatter.default_msec_format = '%s.%03d'
然而,由于未知的原因,这并没有起作用。
PS.我使用的是Python 3.8。