我正在使用日志记录模块来创建记录器并输出数据。除了使用$(asctime)s
中的logging.Formatter
之外,还有一种记录与创建记录器相关的时间戳的好方法吗?
from datetime import timedelta
import logging
import time
class ElapsedFormatter():
def __init__(self):
self.start_time = time.time()
def format(self, record):
elapsed_seconds = record.created - self.start_time
#using timedelta here for convenient default formatting
elapsed = timedelta(seconds = elapsed_seconds)
return "{} {}".format(elapsed, record.getMessage())
#add custom formatter to root logger for simple demonstration
handler = logging.StreamHandler()
handler.setFormatter(ElapsedFormatter())
logging.getLogger().addHandler(handler)
log = logging.getLogger('test')
log.error("Message 1")
time.sleep(5)
log.error("Message 2")
您的问题是指从“程序开始”到“记录器创建”所经过的时间,这可能意味着不同的情况。这将测量从创建
CustomFormatter
开始所花费的时间,您可以在程序开始时或创建记录器时执行此操作。
logging
的子类logging.Formatter
%(asctime)s样式。这是一个添加%(delta)s样式的解决方案。
import datetime
import logging
import time
# subclass of logging.Formatter
class RuntimeFormatter(logging.Formatter):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.start_time = time.time()
def formatTime(self, record, datefmt=None):
duration = datetime.datetime.utcfromtimestamp(record.created - self.start_time)
elapsed = duration.strftime('%H:%M:%S')
return "{}".format(elapsed)
# add custom formatter to root logger
LOGFORMAT = '%(asctime)s - %(levelname)-9s: %(message)s'
handler = logging.StreamHandler()
fmt = RuntimeFormatter(LOGFORMAT)
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)
logger = logging.getLogger()
# test of the logger output
logger.error('Test')