Skip to content

Commit

Permalink
update logging
Browse files Browse the repository at this point in the history
  • Loading branch information
SAKURA-CAT committed Jun 18, 2024
1 parent c62494a commit 218c951
Show file tree
Hide file tree
Showing 4 changed files with 232 additions and 156 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
venv/
test/temp/
dist/
__pycache__
__pycache__/
.pytest_cache/
playground/
.DS_Store
168 changes: 168 additions & 0 deletions docs/wiki/第4部分:日志打印.md
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.
Loading

0 comments on commit 218c951

Please sign in to comment.