自程序启动以来的Python记录时间

时间:2014-08-08 01:41:16

标签: python logging

我使用日志记录模块创建记录器和输出数据。而不是在$(asctime)s中使用logging.Formatter,是否有一种很好的方法来记录相对于记录器创建的时间戳?

4 个答案:

答案 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')