-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c62494a
commit 218c951
Showing
4 changed files
with
232 additions
and
156 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,7 @@ | |
venv/ | ||
test/temp/ | ||
dist/ | ||
__pycache__ | ||
__pycache__/ | ||
.pytest_cache/ | ||
playground/ | ||
.DS_Store |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
为了方便一些信息的展示,swankit提供了一个简单的日志打印类,它实现了与[logging](https://docs.python.org/zh-cn/3/library/logging.html) | ||
类似的终端打印功能。 | ||
|
||
## 使用日志打印功能 | ||
|
||
[SwanLabSharedLog](https://github.com/SwanHubX/SwanLab-Toolkit/blob/main/swankit/log/log.py) 实现了一个简单的日志打印功能,与 | ||
logging类似,有`debug`、`info`、`warning`、`error`、`critical`等级别的日志打印功能。 | ||
但由于logging很多功能我们并不需要并且有一些兼容性问题,所以我们自己实现了一个类似的。 | ||
|
||
> SwanLabSharedLog使用了[FONT](https://github.com/SwanHubX/SwanLab-Toolkit/blob/main/swankit/log/utils.py) | ||
> 类,并且此类也作为日志的一部分功能暴露,参考[为终端打印添加颜色](#为终端打印添加颜色)。 | ||
### 基本使用方式 | ||
|
||
通过如下方式使用日志打印功能: | ||
|
||
````python | ||
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) | 日志等级 | 当前日志输出等级 | | ||
|
||
##### level | ||
|
||
`level`属性为日志的输出等级,可以通过`logger.level`获取。 | ||
需要注意的是,获取到的日志等级为int类型,可以通过`swankit.log.DEBUG`等获取到对应的日志等级对应的等级值。 | ||
|
||
**此方法为代理方法**,因此可以通过`logger.level = "debug"`的方式重新设置当前日志等级,考虑到方法为内部使用,所以如果设置的值不在 | ||
期望的范围内,会设置为默认值`info`。 | ||
|
||
### 方法 | ||
|
||
| Method | 名称 | 描述 | | ||
|-----------------------------|--------|-------------------------| | ||
| [日志打印方法](#日志打印方法) | 打印日志 | 为了方便调用,使用不同的方法名对应不同的等级值 | | ||
| [disable_log](#disable_log) | 关闭日志打印 | 关闭日志打印功能 | | ||
| [disable_log](#disable_log) | 开启日志打印 | 开启日志打印功能 | | ||
|
||
#### 日志打印方法 | ||
|
||
SwanLabSharedLog提供了`debug`、`info`、`warning`、`error`、`critical`等方法,分别对应不同的日志等级,调用方式如下: | ||
|
||
````python | ||
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) | 实现类似转圈圈的终端loading效果,并且同时执行一个函数任务 | | ||
| [swanlab](#swanlab) | 用于为某一条信息添加swanlab前缀(即将废除) | | ||
| [brush](#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](#brush) | | ||
|
||
#### swanlab | ||
|
||
此函数为字符串添加swanlab前缀,可选择color颜色(需要FONT支持的方法),即将废除,不建议使用。 | ||
|
||
#### brush | ||
|
||
此函数用于刷去当前终端行,替换为新的字符串,其参数如下: | ||
|
||
| 参数名 | 类型 | 说明 | | ||
|--------|-----|---------------| | ||
| s | str | 需要替换的字符串 | | ||
| length | int | 需要刷去的长度,默认为20 | | ||
|
||
## 相关问题 | ||
|
||
### 为什么不使用python的[logging](https://docs.python.org/zh-cn/3/library/logging.html)库实现日志打印? | ||
|
||
因为似乎存在一些兼容性问题,参考此[issue](https://github.com/SwanHubX/SwanLab-Toolkit/issues/9)。 | ||
|
||
### 应该可以依赖于一些强大的开源库,比如[rich](https://github.com/Textualize/rich)? | ||
|
||
确实可以,但是目前我们并没有用到那么多的功能,所以暂时没有引入。 | ||
|
||
### 为什么FONT.loading方法使用线程实现而不是异步协程? | ||
|
||
因为存在兼容性问题(也有可能是我写的有问题,总之python协程 + 多线程似乎有一些奇怪的问题) | ||
|
Empty file.
Oops, something went wrong.