Skip to content

第4部分:日志打印

wiki-bot edited this page Jun 18, 2024 · 1 revision

为了方便一些信息的展示,swankit提供了一个简单的日志打印类,它实现了与logging 类似的终端打印功能。

使用日志打印功能

SwanLabSharedLog 实现了一个简单的日志打印功能,与 logging类似,有debuginfowarningerrorcritical等级别的日志打印功能。 但由于logging很多功能我们并不需要并且有一些兼容性问题,所以我们自己实现了一个类似的。

SwanLabSharedLog使用了FONT 类,并且此类也作为日志的一部分功能暴露,参考为终端打印添加颜色

基本使用方式

通过如下方式使用日志打印功能:

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,此参数与printfile参数相同

日志等级

logger支持的方法有debuginfowarningerrorcritical,分别对应一个日志等级,等级值如下:

等级名 等级值
DEBUG 10
INFO 20
WARNING 30
ERROR 40
CRITICAL 50

这些在SwanLabSharedLog的同名文件也有定义,可以通过swankit.log.DEBUG等获取到对应的等级值。

属性

Attribute 名称 描述
level 日志等级 当前日志输出等级
level

level属性为日志的输出等级,可以通过logger.level获取。 需要注意的是,获取到的日志等级为int类型,可以通过swankit.log.DEBUG等获取到对应的日志等级对应的等级值。

此方法为代理方法,因此可以通过logger.level = "debug"的方式重新设置当前日志等级,考虑到方法为内部使用,所以如果设置的值不在 期望的范围内,会设置为默认值info

方法

Method 名称 描述
日志打印方法 打印日志 为了方便调用,使用不同的方法名对应不同的等级值
disable_log 关闭日志打印 关闭日志打印功能
disable_log 开启日志打印 开启日志打印功能

日志打印方法

SwanLabSharedLog提供了debuginfowarningerrorcritical等方法,分别对应不同的日志等级,调用方式如下:

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参数, 也会在方法内被覆盖

disable_log

无参数,直接调用即可关闭日志打印功能。

enable_log

无参数,直接调用即可开启日志打印功能。

为终端打印添加颜色

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

此函数本质上使用线程实现,一般用于发送请求时的loading效果,其参数如下:

参数名 类型 说明
s str loading的提示信息,需要打印的字符串
func Callable 需要执行的函数
args Tuple 函数的参数
interval float loading旋转刷新的间隔时间,默认为0.4s
prefix str loading的前缀,默认为"swanlab: "
brush_length int 刷去的长度,参考brush

swanlab

此函数为字符串添加swanlab前缀,可选择color颜色(需要FONT支持的方法),即将废除,不建议使用。

brush

此函数用于刷去当前终端行,替换为新的字符串,其参数如下:

参数名 类型 说明
s str 需要替换的字符串
length int 需要刷去的长度,默认为20

相关问题

为什么不使用python的logging库实现日志打印?

因为似乎存在一些兼容性问题,参考此issue

应该可以依赖于一些强大的开源库,比如rich

确实可以,但是目前我们并没有用到那么多的功能,所以暂时没有引入。

为什么FONT.loading方法使用线程实现而不是异步协程?

因为存在兼容性问题(也有可能是我写的有问题,总之python协程 + 多线程似乎有一些奇怪的问题)