python - 如何在 loguru 中格式化耗时 (timedelta)?

标签 python datetime logging timedelta loguru

loguru 耗时是 datetime.timedelta目的。 (loguru docs)

我希望时间格式为分钟和秒。因此,如果elapsed.seconds = 123,它将变成2m3s
这通常可以通过 f 字符串中的 {elapsed.seconds//60}m{elapsed.seconds%60}s 或使用 .format() 来实现。

但是如果我在 loguru 的格式参数字符串中使用 f-string,它显然无法识别变量 elapsed.seconds 因为它属于 loguru 而不是当前范围。因此,在 f 字符串的情况下,它会给出错误 AttributeError: 'datetime.timedelta' object has no attribute 'seconds//60'NameError: name 'elapsed' is not Define 如果尝试使用 .format() 这是要复制的代码-

from loguru import logger

logger_format = ('{time:DD-MMM-YYYY HH:mm:ss}'
                  '|{level:<8}| '
                  '({elapsed.seconds}s)')

logger.add('test.log', delay=True, format=logger_format, level='DEBUG')

def print_something(x):
    if type(x) == int:
        print(x)
        logger.debug('Printing int')
        
print_something(2)

这是如果运行时间为 123 秒它可以打印的日志:

07-Jul-2022 18:20:19|DEBUG   | (123s) Printing int

这是我想要打印的日志:

07-Jul-2022 18:20:19|DEBUG   | (2m3s) Printing int

最佳答案

format 参数可以是格式字符串,但也可以是接受记录字典并返回字符串的可调用函数,如下所示:

from loguru import logger

def my_format(record):
    mins = record['elapsed'].seconds // 60
    secs = record['elapsed'].seconds % 60
    return '|{level:<8}| ({mins}m{secs}s)\n{exception}'.format(**record, mins=mins, secs=secs)

logger.add('test.log', delay=True, format=my_format, level='DEBUG')

如果您愿意,也可以使用 f 字符串。

关于python - 如何在 loguru 中格式化耗时 (timedelta)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72898473/

相关文章:

python - Web 抓取带有 <pre> 预格式化文本且没有标签的 .htm 页面

python - 使用 super() 访问第二个基类的方法

python - 从网站获取货币并以字典形式返回

datetime - 在 VBScript 中设置当前日期和时间的格式

Python/Datetime/Pandas - 更改日期时间格式

svn - 如何将 git log(或 svn log)限制为针对某个特定文件的修订?

java - AssertJ 记录断言结果

java - 什么相当于 log4j 2 中的 log4j 1 `log4j.appender.SYSLOG.Header=true`?

python - 在 Python 中导入音轨(wav 或 aiff)

ios - 如何获取该月的第一天?