-
Notifications
You must be signed in to change notification settings - Fork 0
第4部分:日志打印
为了方便一些信息的展示,swankit提供了一个简单的日志打印类,它实现了与logging 类似的终端打印功能。
SwanLabSharedLog 实现了一个简单的日志打印功能,与
logging类似,有debug
、info
、warning
、error
、critical
等级别的日志打印功能。
但由于logging很多功能我们并不需要并且有一些兼容性问题,所以我们自己实现了一个类似的。
通过如下方式使用日志打印功能:
from swankit.log import SwanLabSharedLog
logger = SwanLabSharedLog("test")
logger.info("This is a debug message.") # 输出 test: This is a debug message.
与logging类似,在实例化时可以为其取一个名字,对应不同的日志打印类型,但与logging不同的是,SwanLabSharedLog的实例化并不是全局挂载, 因此即使取两个相同的名字的对象,也不会相互影响。
SwanLabSharedLog的实例化参数如下:
参数名 | 类型 | 说明 |
---|---|---|
name | str | 日志打印的名字,影响日志的前缀部分 |
level | int | 日志的等级,参考日志等级 |
file | SupportsWrite | 日志输出的文件流,可以是sys.stdout、sys.stderr等,默认为标准输出流stdout,此参数与print 的file 参数相同 |
logger支持的方法有debug
、info
、warning
、error
、critical
,分别对应一个日志等级,等级值如下:
等级名 | 等级值 |
---|---|
DEBUG | 10 |
INFO | 20 |
WARNING | 30 |
ERROR | 40 |
CRITICAL | 50 |
这些在SwanLabSharedLog
的同名文件也有定义,可以通过swankit.log.DEBUG
等获取到对应的等级值。
Attribute | 名称 | 描述 |
---|---|---|
level | 日志等级 | 当前日志输出等级 |
level
属性为日志的输出等级,可以通过logger.level
获取。
需要注意的是,获取到的日志等级为int类型,可以通过swankit.log.DEBUG
等获取到对应的日志等级对应的等级值。
此方法为代理方法,因此可以通过logger.level = "debug"
的方式重新设置当前日志等级,考虑到方法为内部使用,所以如果设置的值不在
期望的范围内,会设置为默认值info
。
Method | 名称 | 描述 |
---|---|---|
日志打印方法 | 打印日志 | 为了方便调用,使用不同的方法名对应不同的等级值 |
disable_log | 关闭日志打印 | 关闭日志打印功能 |
disable_log | 开启日志打印 | 开启日志打印功能 |
SwanLabSharedLog提供了debug
、info
、warning
、error
、critical
等方法,分别对应不同的日志等级,调用方式如下:
from swankit.log import SwanLabSharedLog
logger = SwanLabSharedLog("test")
logger.debug("This is a debug message.") # 不输出,因为默认等级为info
logger.info("This is a info message.") # 输出 test: This is a info message.
logger.warning("This is a warning message.") # 输出 test: This is a warning message.
logger.error("This is a error message.") # 输出 test: This is a error message.
logger.critical("This is a critical message.") # 输出 test: This is a critical message.
可以粗略地将打印日志与print
方法相等价,区别在于打印日志会占据file
参数输出流(也就是实例化传入的输出流),即使设置了file
参数,
也会在方法内被覆盖
无参数,直接调用即可关闭日志打印功能。
无参数,直接调用即可开启日志打印功能。
SwanLabSharedLog使用了FONT来为终端打印添加颜色,这是一个简单的方法集合,可以为终端打印添加颜色, 特别的,有一个loading方法,可以实现类似转圈圈的loading效果,FONT支持的函数如下:
函数名 | 描述 |
---|---|
loading | 实现类似转圈圈的终端loading效果,并且同时执行一个函数任务 |
swanlab | 用于为某一条信息添加swanlab前缀(即将废除) |
brush | 将当前终端行刷去,替换为新的字符串 |
debug | 为字符串添加当前终端的默认颜色 |
bold | 为字符串添加粗体效果 |
blue | 为字符串添加蓝色效果 |
grey | 为字符串添加灰色效果 |
dark_grey | 为字符串添加深灰色效果 |
green | 为字符串添加绿色效果 |
dark_green | 为字符串添加深绿色效果 |
yellow | 为字符串添加黄色效果 |
red | 为字符串添加红色效果 |
magenta | 为字符串添加洋红色效果 |
underline | 为字符串添加下划线效果 |
clear | 清除字符串的颜色(包括下划线)编码 |
在此列出FONT支持的一些较为复杂的方法
此函数本质上使用线程实现,一般用于发送请求时的loading效果,其参数如下:
参数名 | 类型 | 说明 |
---|---|---|
s | str | loading的提示信息,需要打印的字符串 |
func | Callable | 需要执行的函数 |
args | Tuple | 函数的参数 |
interval | float | loading旋转刷新的间隔时间,默认为0.4s |
prefix | str | loading的前缀,默认为"swanlab: " |
brush_length | int | 刷去的长度,参考brush |
此函数为字符串添加swanlab前缀,可选择color颜色(需要FONT支持的方法),即将废除,不建议使用。
此函数用于刷去当前终端行,替换为新的字符串,其参数如下:
参数名 | 类型 | 说明 |
---|---|---|
s | str | 需要替换的字符串 |
length | int | 需要刷去的长度,默认为20 |
为什么不使用python的logging库实现日志打印?
因为似乎存在一些兼容性问题,参考此issue。
应该可以依赖于一些强大的开源库,比如rich?
确实可以,但是目前我们并没有用到那么多的功能,所以暂时没有引入。
因为存在兼容性问题(也有可能是我写的有问题,总之python协程 + 多线程似乎有一些奇怪的问题)