Loguru 包 Github 仓库地址 Loguru 包官方文档
介绍 Loguru 提供了一个简单的方式输出日志信息. 其仅提供 logger
一个接口处理所有内容.
安装
基本使用 1 2 3 4 5 6 7 8 from loguru import logger logger.debug("This is a debug message" ) logger.info("This is an info message" ) logger.warning("This is a warning message" ) logger.error("This is an error message" ) logger.critical("This is a critical message" )
添加 Handler Handler 可定义日志输出位置, 输出格式 (formatter), 指定对哪些 logger 起作用 (filter), 以及大体指定起作用的 log level (指定的 level 及其以上都会被作用到, filter 在其下再过滤).
一个基本示例:
1 2 3 4 5 6 7 8 9 10 from loguru import logger logger.add("hello.log" , level="DEBUG" , filter =lambda record: record["level" ].name == "INFO" ) logger.debug("这是一条调试信息" ) logger.info("这是一条信息" ) logger.warning("这是一条警告信息" ) logger.error("这是一条错误信息" )
这里添加了一个 handler:
输出到 hello.log
文件
对 DEBUG
level 以上的日志输出起作用
filter
, 表明只对 INFO
level 起作用
下面给一个设置 format 的示例:
1 2 3 4 5 6 7 from loguru import loggerimport sys logger.remove(0 ) logger.add(sys.stderr, level='INFO' , format ="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{line} - {message}" ) logger.info("This is an info message." )
输出为:
1 2024 -09 -13 14 :22 :23 | INFO | table:6 - This is an info message.
这里有几个格式化占位符需要注意:
{time}
: 日志记录的时间. 你可以自定义时间格式, 例如: {time:YYYY-MM-DD HH:mm:ss}
: 输出为 2024-09-13 12:34:56
{level}
: 日志级别 (如 DEBUG, INFO, WARNING, ERROR, CRITICAL)
{message}
: 日志消息的内容
{name}
: 日志记录器的名称
{module}
: 记录日志的模块名称
{function}
: 记录日志的函数名称
{line}
: 记录日志的代码行号
{process}
: 进程 ID
{thread}
: 线程 ID
这些也可以用在指定输出的位置, 如:
1 logger.add("file_{time}.log" )
移除 Handler 在用 add()
添加 handler 时, 会返回一个 id 值用于指定 handler. 默认的 handler id 为 0, 也可以移除:
1 2 3 4 5 from loguru import logger logger.remove(0 ) logger.debug("hello?" )
会没有任何输出. (毕竟被移除了)
另一个示例:
1 2 3 4 5 6 7 from loguru import logger new_handler_id = logger.add("hello.log" , level="debug" ) logger.remove(new_handler_id) logger.debug("Still default one!" )
Rotation, Retention 以及 compression Log rotation, 日志文件达到一定大小或时间后, 自动创建新的日志文件并将旧的日志文件保存或归档的过程.
Log retention, 决定保留多长时间的日志文件以及在何种情况下删除旧日志.
Log compression, 指在轮换或保留日志时, 对旧日志文件进行压缩.
示例:
1 2 3 4 5 6 7 8 9 10 11 12 from loguru import loggerimport time logger.add("my_log.log" , rotation="1 MB" , retention="7 days" , compression="zip" ) for i in range (20000 ): logger.info(f"This is log message number {i} " )
错误处理 可以用 @logger.catch
修饰器来捕获函数的报错:
1 2 3 4 5 6 7 8 from loguru import logger@logger.catch def my_function (x, y, z ): return 1 / (x + y + z) my_function(0 ,0 ,0 )
(输出效果更好)
详细错误跟踪 1 2 3 4 5 6 7 8 9 10 11 12 13 logger.add("out.log" , backtrace=True , diagnose=True )def func (a, b ): return a / bdef nested (c ): try : func(5 , c) except ZeroDivisionError: logger.exception("What?!" ) nested(0 )
颜色设置 如:
1 logger.add(sys.stdout, colorize=True , format ="<green>{time}</green> <level>{message}</level>" )
用 <color></color>
包裹想要高亮的信息
自定义 levels 用 logger.level()
来创建, 如:
1 2 3 new_level = logger.level("SNAKY" , no=38 , color="<yellow>" , icon="🐍" ) logger.log("SNAKY" , "Here we go!" )
结合 notifier 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import notifiers params = { "username" : "you@gmail.com" , "password" : "abc123" , "to" : "dest@gmail.com" } notifier = notifiers.get_notifier("gmail" ) notifier.notify(message="The application is running!" , **params)from notifiers.logging import NotificationHandler handler = NotificationHandler("gmail" , defaults=params) logger.add(handler, level="ERROR" )
在遇到 ERROR
level 的报错时, 发送邮件到指定位置.