微秒在Python记录器格式中不起作用

af7jpaap  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(118)

由于某种原因,我的Python记录器不想识别微秒格式。

import logging, io

stream = io.StringIO()
logger = logging.getLogger("TestLogger")
logger.setLevel(logging.INFO)
logger.propagate = False
log_handler = logging.StreamHandler(stream)
log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s',"%Y-%m-%d %H:%M:%S.%f %Z")
log_handler.setFormatter(log_format)
logger.addHandler(log_handler)

logger.info("This is test info log")
print(stream.getvalue())

它返回:

2023-01-06 18:52:34.%f UTC - TestLogger - INFO - This is test info log

为什么少了微秒?

    • 更新**

我正在运行Python 3.10.4发行商ID:Debian描述:Debian GNU/Linux 11(靶心)发行版:11代号:靶心

vngu2lb8

vngu2lb81#

问题在于formatTime方法使用time.strptime来格式化当前的time.time(),但是由于struct_time没有关于millisecondsmicroseconds的信息,因此格式化程序忽略了%f
另外,请注意LogRecord单独计算毫秒数,并将它们存储在另一个名为msecs的变量中
为了得到你想要的,我们需要一个Formatter类的自定义版本,它使用不同于time.localtime的转换器,并且能够解释微秒:

from datetime import datetime

class MyFormatter(logging.Formatter):
    def formatTime(self, record, datefmt=None):
        if not datefmt:
            return super().formatTime(record, datefmt=datefmt)

        return datetime.fromtimestamp(record.created).astimezone().strftime(datefmt)

...
log_format = MyFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S.%f %Z")
...

应输出:
x1米11米1x

相关问题