如何按需重置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
相关产品推荐
相关产品推荐

