我使用日志记录模块创建记录器和输出数据。而不是在$(asctime)s
中使用logging.Formatter
,是否有一种很好的方法来记录相对于记录器创建的时间戳?
答案 0 :(得分:12)
在传统的Formatter
格式字符串中使用%(relativeCreated)d
字段将显示自加载logging
模块以来经过的毫秒数。虽然毫秒可能不是你想要的,但是不需要额外的编码。
答案 1 :(得分:8)
您可以编写自己的格式化程序:
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
开始经过的时间,您可以在程序开始时或创建记录器时执行该操作。
答案 2 :(得分:0)
我基于一些stackoverflow想法编写了自己的解决方案。
它是logging.Formatter
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')
答案 3 :(得分:0)
我喜欢Franky1的回答,但我不想失去日志格式的%(asctime)s 样式。这是一种添加%(delta)s 样式的解决方案。
import datetime
import logging
import time
class DeltaTimeFormatter(logging.Formatter):
def format(self, record):
duration = datetime.datetime.utcfromtimestamp(record.relativeCreated / 1000)
record.delta = duration.strftime("%H:%M:%S")
return super().format(record)
# add custom formatter to root logger
handler = logging.StreamHandler()
LOGFORMAT = '+%(delta)s - %(asctime)s - %(levelname)-9s: %(message)s'
fmt = DeltaTimeFormatter(LOGFORMAT)
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)
logger = logging.getLogger()
# test of the logger output
logger.error('Test')
for sleep in (1, 2, 3, 4, 5):
time.sleep(sleep)
logger.error('logging')