sinlog 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/License +1 -1
- data/docs/Readme-zh.md +114 -100
- data/docs/Readme.md +139 -111
- data/lib/{init.rb → sinlog/init.rb} +26 -10
- data/lib/sinlog/log_ext.rb +74 -0
- data/lib/sinlog/log_short_ext.rb +81 -0
- data/lib/sinlog/loggable.rb +57 -0
- data/lib/sinlog/version.rb +1 -1
- data/lib/sinlog.rb +40 -9
- data/rbi/sinlog/init.rbi +34 -0
- data/rbi/sinlog/log_ext.rbi +37 -0
- data/rbi/sinlog/log_short_ext.rbi +37 -0
- data/rbi/sinlog/loggable.rbi +25 -0
- data/rbi/sinlog/version.rbi +3 -0
- metadata +13 -7
- data/lib/lambda.rb +0 -184
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7b6ddc12bba2068f177da14004c4c8d809576a7fd03447ee5dae69fb19d9697b
|
|
4
|
+
data.tar.gz: 8dec27b670c17916d872d6d36a647ee95080375fc01b78933e334bb1219c3578
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f7af956f2543e0b4232f1e5a13b6d7c50bbb0a76e1e3ba4f93ae0e3d9fbd62f853c4e04edc176c7bec77e8cd5040d36b6d3c3b521b5a32091ef63824cada8a17
|
|
7
|
+
data.tar.gz: 61ae061833061c93ada7731fec870e9fc70df91f0f6be904aa6165eacbc745a8b876a153c8b941b3b26b4e9177169ffaae47720579e60c50512f9f56ce2a3670
|
data/License
CHANGED
data/docs/Readme-zh.md
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
> 单例(Singleton)意味着整个程序会共享同一个实例(日志记录器)。
|
|
6
6
|
|
|
7
|
+
[](https://rubygems.org/gems/sinlog)
|
|
8
|
+
<!-- [](https://www.rubydoc.info/gems/sinlog) -->
|
|
9
|
+
|
|
7
10
|
---
|
|
8
11
|
|
|
9
12
|
| Language/語言 | ID |
|
|
@@ -19,10 +22,17 @@
|
|
|
19
22
|
目录(点击展开)
|
|
20
23
|
</summary>
|
|
21
24
|
|
|
25
|
+
- [快速上手](#快速上手)
|
|
26
|
+
- [安装](#安装)
|
|
27
|
+
- [对比](#对比)
|
|
28
|
+
- [方法列表](#方法列表)
|
|
29
|
+
- [Loggable \& LogExt](#loggable--logext)
|
|
30
|
+
- [LogShortExt](#logshortext)
|
|
31
|
+
- [例子](#例子)
|
|
32
|
+
- [经典方法调用 (非 mixin,亦非 refinement)](#经典方法调用-非-mixin亦非-refinement)
|
|
33
|
+
- [Mixin](#mixin)
|
|
34
|
+
- [Refinement](#refinement)
|
|
22
35
|
- [Learn Sinlog API By Example](#learn-sinlog-api-by-example)
|
|
23
|
-
- [include module](#include-module)
|
|
24
|
-
- [LambdaExt](#lambdaext)
|
|
25
|
-
- [LogLambdaExt](#loglambdaext)
|
|
26
36
|
- [Classic Method Call](#classic-method-call)
|
|
27
37
|
- [进阶](#进阶)
|
|
28
38
|
- [Real World Example](#real-world-example)
|
|
@@ -36,133 +46,135 @@
|
|
|
36
46
|
|
|
37
47
|
</details>
|
|
38
48
|
|
|
39
|
-
##
|
|
49
|
+
## 快速上手
|
|
40
50
|
|
|
41
|
-
|
|
51
|
+
## 安装
|
|
42
52
|
|
|
43
53
|
```sh
|
|
54
|
+
# POSIX-sh
|
|
55
|
+
#
|
|
44
56
|
gem install sinlog
|
|
45
57
|
```
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
### 对比
|
|
48
60
|
|
|
49
|
-
|
|
61
|
+
| 模块 | 类型 | 方法 |
|
|
62
|
+
| ----------- | ---------- | -------------------------------------------- |
|
|
63
|
+
| Loggable | Mixin | `log_dbg`, `log_info`, etc. |
|
|
64
|
+
| LogExt | Refinement | `log_dbg`, `log_info`, etc. |
|
|
65
|
+
| LogShortExt | Refinement | `dbg`, `info`, `warn`, `err`, `fatal`, `unk` |
|
|
50
66
|
|
|
51
|
-
#### LambdaExt
|
|
52
67
|
|
|
53
|
-
|
|
68
|
+
### 方法列表
|
|
54
69
|
|
|
55
|
-
|
|
56
|
-
irb(main):001> require 'sinlog'
|
|
70
|
+
#### Loggable & LogExt
|
|
57
71
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
- `log_dbg` – DEBUG
|
|
73
|
+
- `log_info` – INFO
|
|
74
|
+
- `log_warn` – WARN
|
|
75
|
+
- `log_err` – ERROR
|
|
76
|
+
- `log_fatal` – FATAL
|
|
77
|
+
- `log_unk` – UNKNOWN
|
|
61
78
|
|
|
62
|
-
|
|
63
|
-
irb(main):004> 'information'.tap(&info)
|
|
79
|
+
#### LogShortExt
|
|
64
80
|
|
|
65
|
-
|
|
66
|
-
# 因此 LambdaExt 用的是 warning, 而不是 warn。
|
|
67
|
-
# 您如果确实需要 warn,那就调用 include Sinlog::LambdaWarnExt
|
|
68
|
-
irb(main):005> 'warning'.tap(&warning)
|
|
81
|
+
LogShortExt 类似于 LogExt。
|
|
69
82
|
|
|
70
|
-
|
|
71
|
-
irb(main):007> 'fatal'.tap(&fatal)
|
|
72
|
-
irb(main):008> 'unknown'.tap(&unk)
|
|
73
|
-
```
|
|
83
|
+
除了方法的命名不同外,二者的内部实现没有任何区别。
|
|
74
84
|
|
|
75
|
-
|
|
85
|
+
- LogExt 的方法带有 `log_` 前缀
|
|
86
|
+
- LogShortExt 没有
|
|
76
87
|
|
|
77
|
-
|
|
88
|
+
---
|
|
78
89
|
|
|
79
|
-
- dbg
|
|
80
|
-
- info
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
- unk
|
|
90
|
+
- `dbg` – DEBUG
|
|
91
|
+
- `info` – INFO
|
|
92
|
+
- `warn` – WARN
|
|
93
|
+
- `err` – ERROR
|
|
94
|
+
- `fatal` – FATAL
|
|
95
|
+
- `unk` – UNKNOWN
|
|
86
96
|
|
|
87
|
-
|
|
97
|
+
> ⚠️ 由于 LogShortExt 带有 warn 方法,因此会覆盖 warn。
|
|
98
|
+
> 对于 ruby 代码中的 `warn "msg"`,您可能需要手动将其修改为 `Kernel.warn "msg"`
|
|
99
|
+
>
|
|
100
|
+
> 如果介意的话,那就使用 `using Sinlog::LogExt` 而不是 `using Sinlog::LogShortExt`。
|
|
88
101
|
|
|
89
|
-
|
|
90
|
-
它们之间最主要的区别在于 lambda 函数的名称。
|
|
102
|
+
### 例子
|
|
91
103
|
|
|
92
|
-
|
|
93
|
-
- LambdaExt 没有
|
|
104
|
+
#### 经典方法调用 (非 mixin,亦非 refinement)
|
|
94
105
|
|
|
95
|
-
|
|
106
|
+
```ruby
|
|
107
|
+
require 'sinlog'
|
|
96
108
|
|
|
97
|
-
|
|
109
|
+
log = Sinlog.logger
|
|
110
|
+
log.info "Information"
|
|
111
|
+
log.debug "This is a debug message"
|
|
112
|
+
```
|
|
98
113
|
|
|
99
|
-
|
|
114
|
+
#### Mixin
|
|
100
115
|
|
|
101
116
|
```ruby
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
117
|
+
require 'sinlog'
|
|
118
|
+
include Sinlog::Loggable
|
|
119
|
+
"Hello".log_info
|
|
120
|
+
```
|
|
121
|
+
#### Refinement
|
|
105
122
|
|
|
106
|
-
|
|
107
|
-
|
|
123
|
+
```ruby
|
|
124
|
+
require 'sinlog'
|
|
125
|
+
using Sinlog::LogExt
|
|
126
|
+
{ dir: "/path/to/xx" }.log_info
|
|
127
|
+
```
|
|
108
128
|
|
|
109
|
-
|
|
110
|
-
irb(main):012> "warning".tap(&log_warn)
|
|
129
|
+
## Learn Sinlog API By Example
|
|
111
130
|
|
|
112
|
-
|
|
113
|
-
irb(main):014> "fatal".tap(&log_fatal)
|
|
114
|
-
irb(main):015> "unknown".tap(&log_unk)
|
|
115
|
-
```
|
|
131
|
+
<img src="../assets/img/预览.png" alt="预览">
|
|
116
132
|
|
|
117
133
|
```ruby
|
|
118
|
-
|
|
119
|
-
irb(main):016> require 'pathname'
|
|
120
|
-
|
|
121
|
-
irb(main):017> Pathname('lib/lambda.rb').tap do
|
|
122
|
-
"Filename: #{it}".then(&log_info)
|
|
123
|
-
"size: #{
|
|
124
|
-
it
|
|
125
|
-
.tap{ '⚠️ 获取文件大小可能会失败'.then(&log_warn) }
|
|
126
|
-
.size
|
|
127
|
-
}".then(&log_info)
|
|
128
|
-
end
|
|
129
|
-
```
|
|
134
|
+
require 'sinlog'
|
|
130
135
|
|
|
131
|
-
|
|
136
|
+
class A
|
|
137
|
+
using Sinlog::LogShortExt
|
|
132
138
|
|
|
133
|
-
|
|
139
|
+
def self.log
|
|
140
|
+
'您好,我是一条调试消息。
|
|
141
|
+
您可能会觉得我有点啰嗦,哈哈哈!'.dbg
|
|
142
|
+
'神经,害我笑了一下'.info
|
|
134
143
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
- log_fatal
|
|
142
|
-
- log_unk
|
|
144
|
+
'开门!查水表。'.warn
|
|
145
|
+
{ error: "IO", type: "输入数据无效" }.err
|
|
146
|
+
'不行啦!出错了,继续运行下去会坏掉的。'.err
|
|
147
|
+
'滋滋滋,已经坏..掉...了..了~'.fatal
|
|
148
|
+
end
|
|
149
|
+
end
|
|
143
150
|
|
|
144
|
-
|
|
151
|
+
Sinlog::LV[:info].then do
|
|
152
|
+
Sinlog.logger_with_level it
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
A.log
|
|
156
|
+
```
|
|
145
157
|
|
|
146
|
-
|
|
158
|
+
### Classic Method Call
|
|
147
159
|
|
|
148
|
-
|
|
160
|
+
您如果不喜欢 `msg.info` 这种做法 ,那不妨试试经典的方法调用吧!(i.e., `log.info(msg)`)
|
|
149
161
|
|
|
150
162
|
```ruby
|
|
151
|
-
|
|
163
|
+
require 'sinlog'
|
|
152
164
|
|
|
153
|
-
|
|
165
|
+
log = Sinlog.logger
|
|
154
166
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
167
|
+
log.debug 'debug'
|
|
168
|
+
log.info 'information'
|
|
169
|
+
log.warn 'warning'
|
|
170
|
+
log.error 'error'
|
|
171
|
+
log.fatal 'fatal'
|
|
172
|
+
log.unknown 'unknown'
|
|
161
173
|
```
|
|
162
174
|
|
|
163
|
-
Sinlog.
|
|
175
|
+
> `Sinlog.logger` 的数据类型为 ruby 标准库的 Logger。
|
|
164
176
|
|
|
165
|
-
|
|
177
|
+
除了以下这些常见的方法外,您还可以使用 `.reopen` 等其他的方法,详见 <https://docs.ruby-lang.org.cn/en/3.4/Logger.html>
|
|
166
178
|
|
|
167
179
|
- debug
|
|
168
180
|
- info
|
|
@@ -173,7 +185,7 @@ Sinlog.instance.logger 提供了 ruby 标准库的 logger 的方法。
|
|
|
173
185
|
|
|
174
186
|
## 进阶
|
|
175
187
|
|
|
176
|
-
在亲自上手尝试之后,我们已经对 sinlog 有了初步的了解。
|
|
188
|
+
在亲自上手尝试之后,我们已经对 sinlog 有了初步的了解。
|
|
177
189
|
在一般情况下,了解其基本用法就已经足够了。
|
|
178
190
|
|
|
179
191
|
您如果对此感兴趣的话,不妨与我一同继续探索。
|
|
@@ -188,9 +200,8 @@ require 'sinlog'
|
|
|
188
200
|
class EpubProcessor
|
|
189
201
|
def initialize(epub_file, logger = nil)
|
|
190
202
|
@epub = epub_file
|
|
191
|
-
@logger = logger || Sinlog.instance.tap { it.
|
|
203
|
+
@logger = logger || Sinlog.instance.tap { it.set_level_from_env!("XX_LOG") }.logger
|
|
192
204
|
@logger.debug "EpubProcessor class 初始化完成。"
|
|
193
|
-
|
|
194
205
|
end
|
|
195
206
|
end
|
|
196
207
|
```
|
|
@@ -217,9 +228,12 @@ p Sinlog::LV
|
|
|
217
228
|
# => {debug: 0, info: 1, warn: 2, error: 3, fatal: 4, unknown: 5}
|
|
218
229
|
|
|
219
230
|
# 将日志级别修改为 warn
|
|
220
|
-
log = Sinlog.
|
|
221
|
-
#
|
|
222
|
-
#
|
|
231
|
+
log = Sinlog.logger_with_level(Sinlog::LV[:warn])
|
|
232
|
+
# OR:
|
|
233
|
+
# log = Sinlog.logger.tap { it.level = Sinlog::LV[:warn] }
|
|
234
|
+
# OR:
|
|
235
|
+
# log = Sinlog.instance.logger.tap { it.level = 2 }
|
|
236
|
+
|
|
223
237
|
|
|
224
238
|
log.error "这条消息会显示出来!低级别 WARN(2)会显示高级别 ERROR(3) 的日志。"
|
|
225
239
|
log.info "这条消息不会显示出来!高级别 WARN(2) 不会显示低级别 INFO(1) 的日志。"
|
|
@@ -231,14 +245,14 @@ log.info "这条消息不会显示出来!高级别 WARN(2) 不会显示低级
|
|
|
231
245
|
|
|
232
246
|
### 环境变量
|
|
233
247
|
|
|
234
|
-
在现实世界中,对于客户端应用,最后运行程序的是普通用户。
|
|
248
|
+
在现实世界中,对于客户端应用,最后运行程序的是普通用户。
|
|
235
249
|
为了能让普通用户直接配置 log.level,我们可以通过环境变量来配置。
|
|
236
250
|
|
|
237
251
|
> 使用环境变量足够简单也足够高效。
|
|
238
252
|
|
|
239
253
|
Sinlog 在默认情况下,会尝试读取环境变量 RUBY_LOG 的值。
|
|
240
254
|
|
|
241
|
-
本质上调用了 `
|
|
255
|
+
本质上调用了 `set_level_from_env!(env_name = 'RUBY_LOG')` 函数。
|
|
242
256
|
|
|
243
257
|
- 若该环境变量不存在,则使用 debug(0)。
|
|
244
258
|
- 若该环境变量存在,且其值为空,则使用 unknown(5)。
|
|
@@ -262,7 +276,7 @@ export XX_CLI_LOG=info
|
|
|
262
276
|
ruby:
|
|
263
277
|
|
|
264
278
|
```ruby
|
|
265
|
-
logger = Sinlog.instance.tap { it.
|
|
279
|
+
logger = Sinlog.instance.tap { it.set_level_from_env!("XX_CLI_LOG") }.logger
|
|
266
280
|
|
|
267
281
|
logger.debug "由于当前日志级别为 INFO(1),因此不会显示此消息 DEBUG(0)。"
|
|
268
282
|
logger.info "Hello!"
|
|
@@ -276,7 +290,7 @@ logger.info "Hello!"
|
|
|
276
290
|
|
|
277
291
|
```ruby
|
|
278
292
|
# 日志会输出到 a.log 文件
|
|
279
|
-
log = Sinlog.
|
|
293
|
+
log = Sinlog.logger.tap {it.reopen("a.log")}
|
|
280
294
|
|
|
281
295
|
log.error "发生甚么事了!QuQ"
|
|
282
296
|
```
|
|
@@ -284,7 +298,7 @@ log.error "发生甚么事了!QuQ"
|
|
|
284
298
|
OR:
|
|
285
299
|
|
|
286
300
|
```ruby
|
|
287
|
-
log = Sinlog.
|
|
301
|
+
log = Sinlog.logger
|
|
288
302
|
log.reopen("a.log")
|
|
289
303
|
|
|
290
304
|
log.error "发生甚么事了!QuQ"
|
|
@@ -292,7 +306,7 @@ log.error "发生甚么事了!QuQ"
|
|
|
292
306
|
|
|
293
307
|
### 其他 logger 方法
|
|
294
308
|
|
|
295
|
-
除了 `.reopen`, `.level` 外,我们还可以在 `Sinlog.
|
|
309
|
+
除了 `.reopen`, `.level` 外,我们还可以在 `Sinlog.logger` 上调用 ruby 标准库的 logger 的其他方法。
|
|
296
310
|
|
|
297
311
|
### 注意事项
|
|
298
312
|
|
|
@@ -302,7 +316,7 @@ Sinlog 用的是 Singleton 单例模式,整个程序会共享同一个实例
|
|
|
302
316
|
|
|
303
317
|
## 题外话
|
|
304
318
|
|
|
305
|
-
这是我发布的第一个 ruby gem。
|
|
319
|
+
这是我发布的第一个 ruby gem。
|
|
306
320
|
其中的 api 不一定符合地道的 ruby 用法,还请大家多多谅解。
|
|
307
321
|
|
|
308
322
|
## License
|