You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按需重置Loguru日志中的elapsed时间基准?

如何重置Loguru的elapsed时间基准?

我在使用Loguru做测试日志时,每次启动新测试或重跑测试都会移除旧的file-handler并添加新处理器,目的是按运行实例分隔日志、记录新的启动时间。但不管怎么更换处理器,stream-handler和file-handler里的elapsed时间始终以程序最初启动的时间为基准,多次测试后时间越来越大,不符合预期。

已尝试的无效操作

  • 移除并重新添加stream-handler和file-handler,无法重置elapsed基准
  • 搜索仅找到elapsed的格式化方法,未找到重置方案
  • 删除logger对象后重新导入,依然无效

测试代码如下:

import sys
import time

from loguru import logger

logger.remove(0)
logger.add(sys.stderr, format='<light-black>{elapsed}</> | <cyan>{level:8}</> <light-cyan>|</> <level>{message}</>')
logger.info('test')
time.sleep(1)
logger.info('test')

del logger
from loguru import logger

logger.remove(0)
logger.add(sys.stderr, format='<light-black>{elapsed}</> | <cyan>{level:8}</> <light-cyan>|</> <level>{message}</>')
logger.info('test')
time.sleep(1)
logger.info('test')

解决方案:创建新的Logger实例

Loguru默认的logger是全局单例,其elapsed基准是实例创建时的时间,删除后重新导入还是同一个实例,因此无法重置。正确做法是每次测试时创建新的Logger实例,新实例的elapsed会以自身创建时间为基准。

示例代码1:创建独立Logger实例

import sys
import time
from loguru import Logger, _defaults

def get_new_logger():
    # 创建新Logger实例,沿用默认配置但重置时间基准
    logger = Logger(
        level=_defaults.LOGURU_LEVEL,
        format=_defaults.LOGURU_FORMAT,
        filter=_defaults.LOGURU_FILTER,
        exception_formatter=_defaults.LOGURU_EXCEPTION_FORMATTER,
    )
    # 移除默认handler,添加自定义输出
    logger.remove()
    logger.add(sys.stderr, format='<light-black>{elapsed}</> | <cyan>{level:8}</> <light-cyan>|</> <level>{message}</>')
    return logger

# 第一次测试
logger1 = get_new_logger()
logger1.info('test')
time.sleep(1)
logger1.info('test')

# 第二次测试(新实例,elapsed重置)
logger2 = get_new_logger()
logger2.info('test')
time.sleep(1)
logger2.info('test')

示例代码2:重置全局Logger

如果需要保留全局调用的习惯,可以替换默认的logger为新实例:

import sys
import time
from loguru import logger, Logger, _defaults

def reset_global_logger():
    global logger
    logger = Logger(
        level=_defaults.LOGURU_LEVEL,
        format=_defaults.LOGURU_FORMAT,
        filter=_defaults.LOGURU_FILTER,
        exception_formatter=_defaults.LOGURU_EXCEPTION_FORMATTER,
    )
    logger.remove()
    logger.add(sys.stderr, format='<light-black>{elapsed}</> | <cyan>{level:8}</> <light-cyan>|</> <level>{message}</>')

# 第一次使用
reset_global_logger()
logger.info('test')
time.sleep(1)
logger.info('test')

# 重置后第二次使用
reset_global_logger()
logger.info('test')
time.sleep(1)
logger.info('test')

原理说明

Loguru的{elapsed}变量对应Logger实例内部的start_time属性,该属性在实例创建时初始化,且无法直接修改。只有创建新的Logger实例,才能让elapsed的基准时间重置为新实例的创建时间。

内容的提问来源于stack exchange,提问作者ryguycmt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:52:57