Python记录器,相对时间(relativeCreated),可以重设引用吗?

问题描述 投票:0回答:1

我感兴趣地注意到Python日志记录类可以发出相对时间戳:

https://docs.python.org/3/library/logging.html#logrecord-attributes

它具有属性relativeCreated,但记录为:

创建LogRecord的时间,以毫秒为单位,相对于日志模块加载的时间。

我想知道有一种方法可以重置此参考时间(默认情况下是加载日志记录模块的时间)。

我想重置该参考时间,并查看相对于我进行重置的时间点的时间。

python logging
1个回答
0
投票

感谢@Luv,现在可以解决一些进一步的阅读。实际上,事实证明,使用过滤器而不是格式化程序是更好的方法,但这为我提供了一个可以记录相对时间的记录器(以及换行包装器I值):

'''
Logging utilities

To use, just import "log" from here and call log.debug(msg).
'''
from time import time
import re, logging
from re import RegexFlag as ref # Specifically to avoid a PyDev Error in the IDE.

log = logging.getLogger("my_logger")

class RelativeFilter(logging.Filter):
    '''
    Abuse of a logging filter to augment the logged record with some relative timing data.

    For a justification of this abuse see: 
        https://docs.python.org/3/howto/logging-cookbook.html#context-info

    The benefits are:

    1) Attached to logger and not to a handler 
        (solution customizing Formatter are attached to handlers)
        See: https://stackoverflow.com/questions/37900521/subclassing-logging-formatter-changes-default-behavior-of-logging-formatter

    2) Is called for every message that the logger processes. 
    '''
    time_reference = None
    time_last = None

    # A simple RE to suck out prefix and postfix newlines from the message and make them
    # separately available. The formatter can choose to render these or not as it sees fit
    # but a formatter like:
    #     '%(prefix)s other stuff %(message)s% other stuff (postfix)s'
    # will wrap the whole log message in the prefix/postfix pair. 
    RE = re.compile(r'^(?P<newlines1>\n*)(?P<message>.*?)(?P<newlines2>\n*)$', ref.DOTALL)

    def filter(self, record):
        now = time()

        if not self.time_reference:
            self.time_reference = now
        if not self.time_last:
            self.time_last = now

        matches = self.RE.match(record.msg).groupdict()

        record.relativeReference = now - self.time_reference
        record.relativeLast = now - self.time_last
        record.prefix = matches['newlines1']
        record.postfix = matches['newlines2']
        record.msg = matches['message']

        self.time_last = now 
        return True

relative_filter = RelativeFilter()

log.addFilter(relative_filter)

参考时间可以很容易地用:

relative_filter.time_reference = time()

例如。

© www.soinside.com 2019 - 2024. All rights reserved.