Loguru
文章目录
demo
| |
概念
Sink
参考:
解释:
The sink handles incoming log messages and proceed to their writing somewhere and somehow. A sink can take many forms:
- 管理进来的 log
- 处理 log,如何写,如何处理
特点,功能
提交 log
不需要指定 logger 名称
- 直接使用
logger.info(),logger.debug()等搞定
| |
str.format 格式(f-string)提交 log
| |
exception 异常自动捕获
方法: 通过 decorator 以 contextmanager 方式实现
| |
sink (handler)
不需要 handler, formatter, filter
- 直接使用
logger.add()函数搞定
| |
- 删除 handler,
logger.remove()
日志文件处理 rotation, retention, compression
参考:
相关参数:
- first position argument
rotation
- 日志轮转规则
取值:
- int: 文件大小(bytes)
- datetime.timedelta: 时间间隔
- datetime.time: 每日轮转的具体时刻
- str: human-readable, eg: '1 week 3 days', '18:00'
- callable: 回调函数
retention
- 保留日志文件的规则
取值:
- int: 保留几个
- datetime.timedelta: 最大保留时长(多久后删除)
str: human readable 文字指定时长
- eg: '2 months'
- callable: 回调函数判定
compression
- 日志轮转时,执行压缩使用的格式
取值:
- str: eg: gz, bz2, xz, …
formatter 颜色设置
参考:
demo:
| |
变量:
- 时间: {time}
- level: {level}
- 消息: {message}
颜色标签:
前景色 foregroud color
- <red>, <r>
背景色 background color
- <RED>, <R>
16 进制颜色
- foregroud: <fg #0000ff>
- background: <bg #ffee00>
强调标签:
- Bold: <bold>, <b>
- Underline: <underline>, <u>
多进程和多线程 multiprocessing and threading
注意:loguru 默认特征
- 线程安全
- 进程不安全
多进程支持
使用 logger.add() 中的 enqueue=True 参数
demo:
| |
异常栈支持
参考:
方法:
logger.exception()- 类似 logging.exception
通过
logger.add()中的参数diagnose=True- 通过
better_exceptions模块实现 - 对 debug 更有利,打印异常发生时的变量数值
demo:
1 2 3 4 5 6 7 8 9 10 11 12logger.add("out.log", backtrace=True, diagnose=True) # Caution, may leak sensitive data in prod def func(a, b): return a / b def nested(c): try: func(5, c) except ZeroDivisionError: logger.exception("What?!") nested(0)
- 通过
如何便于解析
参考:
json 序列化
解释:
- 序列化 message 内容成为 json
方法:
- 通过
logger.add()参数serialize=True
| |
设置上下文变量
解释:
- 向 logger 传递自定义的上下文变量
方法:
设置变量:
- 通过
logger.bind()设置变量 - 通过
logger.bind().info(),即时设置,即时使用变量 使用
logger.contextualize(var=value)eg:
1 2 3with logger.contextualize(task=task_id): do_something() logger.info("End of task")
通过
logger.patch()修改 record['extra']1 2logger.add(sys.stderr, format="{extra[utc]} {message}") logger = logger.patch(lambda record: record["extra"].update(utc=datetime.utcnow()))
- 通过
接收变量:
- 通过
logger.add()设置 format, 接收变量 - 通过
logger.bind().info()接收临时的变量
- 通过
变量的提取格式
'{extra[my_var]}'record['extra']- 用于 filter
eg:
1 2 3logger.add("special.log", filter=lambda record: "special" in record["extra"]) logger.debug("This message is not logged to the file") logger.bind(special=True).info("This message, though, is logged to the file!")
demo:
| |
执行耗时函数
参考:
eg:
| |
通过 python dict 配置
参考:
方法:
- 通过
logger.configure()实现
eg:
| |
与 python logging 兼容
参考:
logging 为主
| |
- 把 log 从 loguru 引流到 logging
loguru 为主
| |
- 把 logging 中的 log, 引流到 loguru 中
logging 只是作为 loguru 的一个 sink
| |
基础功能
levels, Log 等级
参考:
levels:
- trace
- debug
- info
- success
- warning
- error
- critical
自定义 level
参考
| |
record dict, Log 单条记录
参考:
FAQ
与 fastapi 配合使用
文章作者
上次更新 2022-08-16 (46be7e6)