sinlog 0.0.5 → 0.0.7
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/docs/Changelog.md +40 -0
- data/docs/Readme-zh.md +163 -83
- data/docs/Readme.md +192 -98
- data/lib/sinlog/01_consts.rb +27 -0
- data/lib/sinlog/02_logger.rb +109 -0
- data/lib/sinlog/03_module_fn.rb +146 -0
- data/lib/sinlog/04_log_ext.rb +41 -0
- data/lib/sinlog/05_short_ext.rb +52 -0
- data/lib/sinlog/06_loggable.rb +160 -0
- data/lib/sinlog/07_proc.rb +93 -0
- data/lib/sinlog/08_module_short_ext.rb +89 -0
- data/lib/sinlog/version.rb +2 -2
- data/lib/sinlog.rb +31 -17
- metadata +10 -10
- data/lib/sinlog/init.rb +0 -106
- data/lib/sinlog/log_ext.rb +0 -62
- data/lib/sinlog/log_short_ext.rb +0 -69
- data/lib/sinlog/loggable.rb +0 -57
- data/rbi/sinlog/init.rbi +0 -34
- data/rbi/sinlog/log_ext.rbi +0 -27
- data/rbi/sinlog/log_short_ext.rbi +0 -27
- data/rbi/sinlog/loggable.rbi +0 -25
- data/rbi/sinlog/version.rbi +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 17e9888bbb5141e0cea455861ecb8f138f6e84d5d1cd6bcd12e6ebc7e471850f
|
|
4
|
+
data.tar.gz: 4c042bae2dd42b2340160dccb99a64cdde3c63746f39da5c0cc19ff8094d3d95
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3f6cabc49234fdf2b150ad21cfe4ac65d9359e54008219b1493f5f5a939ba9498ef5638f6ff1fdd636074d1d91a58d990c4fe107f741adaba3f99e5e17306381
|
|
7
|
+
data.tar.gz: 835f9664e09f5cc82194aff7050eec4094fb206b868c201b0c0be982485533c5134429fe930b7eac6327920d6b485ca77bb2aa0b3f2ad3ac6252888881541447
|
data/docs/Changelog.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# ChangeLog
|
|
2
|
+
|
|
3
|
+
- [2025](#2025)
|
|
4
|
+
- [v0.0.6 (2025-11-30)](#v006-2025-11-30)
|
|
5
|
+
- [v0.0.3](#v003)
|
|
6
|
+
|
|
7
|
+
## 2025
|
|
8
|
+
|
|
9
|
+
### v0.0.6 (2025-11-30)
|
|
10
|
+
|
|
11
|
+
- add `Sinlog::ShortMixin` module
|
|
12
|
+
- reimplement `Sinlog.logger` to make the API more user-friendly.
|
|
13
|
+
- We can now configure the log level via `Sinlog.logger(level: "info", env_name: "CUSTOM_ENV_LOG")`.
|
|
14
|
+
- **Note:** When both `level` and `env_name` are provided, `level` takes precedence.
|
|
15
|
+
|
|
16
|
+
Breaking changes:
|
|
17
|
+
|
|
18
|
+
- `using LogExt` => `using Sinlog::Refin`
|
|
19
|
+
- `using LogShortExt` => `using Sinlog::ShortRefin`
|
|
20
|
+
- `include Loggable` => `include Sinlog::Mixin`
|
|
21
|
+
- `Sinlog` class => `Sinlog` module
|
|
22
|
+
- private method: `Sinlog.initialize` => `Sinlog::Logger.initialize`
|
|
23
|
+
- remove `Sinlog.logger_with_level`
|
|
24
|
+
- change the default fallback log level from "unknown(5)" to "error(3)"
|
|
25
|
+
|
|
26
|
+
### v0.0.3
|
|
27
|
+
|
|
28
|
+
- `Sinlog.instance.logger` can be simplified => `Sinlog.logger`
|
|
29
|
+
|
|
30
|
+
- add `Sinlog.logger_with_level`
|
|
31
|
+
- e.g., `logger = Sinlog.logger_with_level(Sinlog::LV[:warn])`
|
|
32
|
+
- old: `Sinlog.instance.logger.tap { it.level = Sinlog::LV[:warn] }`
|
|
33
|
+
|
|
34
|
+
- add `LogExt`, `LogShortExt` and `Loggable`
|
|
35
|
+
|
|
36
|
+
- add sorbet **.rbi** files
|
|
37
|
+
|
|
38
|
+
Breaking changes:
|
|
39
|
+
- `fetch_env_and_update_log_level(ENV_NAME)` => `set_level_from_env!(ENV_NAME)`
|
|
40
|
+
- remove `LogLambdaExt` and related modules
|
data/docs/Readme-zh.md
CHANGED
|
@@ -22,18 +22,22 @@
|
|
|
22
22
|
目录(点击展开)
|
|
23
23
|
</summary>
|
|
24
24
|
|
|
25
|
+
- [API DOC](#api-doc)
|
|
25
26
|
- [快速上手](#快速上手)
|
|
26
|
-
- [安装](#安装)
|
|
27
|
-
- [
|
|
27
|
+
- [安装](#安装)
|
|
28
|
+
- [API style](#api-style)
|
|
29
|
+
- [Procedural Style](#procedural-style)
|
|
30
|
+
- [OOP style](#oop-style)
|
|
31
|
+
- [FP Style](#fp-style)
|
|
32
|
+
- [Monkey Patching](#monkey-patching)
|
|
33
|
+
- [对照表](#对照表)
|
|
28
34
|
- [方法列表](#方法列表)
|
|
29
|
-
- [
|
|
30
|
-
- [
|
|
35
|
+
- [Mixin \& Refin](#mixin--refin)
|
|
36
|
+
- [ShortMixin \& ShortRefin](#shortmixin--shortrefin)
|
|
31
37
|
- [例子](#例子)
|
|
32
|
-
- [经典方法调用 (非 mixin,亦非 refinement)](#经典方法调用-非-mixin亦非-refinement)
|
|
33
|
-
- [Mixin](#mixin)
|
|
34
38
|
- [Refinement](#refinement)
|
|
39
|
+
- [Mixin](#mixin)
|
|
35
40
|
- [Learn Sinlog API By Example](#learn-sinlog-api-by-example)
|
|
36
|
-
- [Classic Method Call](#classic-method-call)
|
|
37
41
|
- [进阶](#进阶)
|
|
38
42
|
- [Real World Example](#real-world-example)
|
|
39
43
|
- [日志级别](#日志级别)
|
|
@@ -46,9 +50,15 @@
|
|
|
46
50
|
|
|
47
51
|
</details>
|
|
48
52
|
|
|
53
|
+
## API DOC
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
- Github Pages: <https://2moe.github.io/sinlog-gem>
|
|
58
|
+
|
|
49
59
|
## 快速上手
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
### 安装
|
|
52
62
|
|
|
53
63
|
```sh
|
|
54
64
|
# POSIX-sh
|
|
@@ -56,18 +66,103 @@
|
|
|
56
66
|
gem install sinlog
|
|
57
67
|
```
|
|
58
68
|
|
|
59
|
-
###
|
|
69
|
+
### API style
|
|
70
|
+
|
|
71
|
+
在此库中,一套相似的功能,有多种不同的调用方式。
|
|
72
|
+
|
|
73
|
+
选择哪种风格,主要取决于您的偏好。
|
|
74
|
+
|
|
75
|
+
#### Procedural Style
|
|
76
|
+
|
|
77
|
+
```ruby
|
|
78
|
+
require 'sinlog'
|
|
79
|
+
|
|
80
|
+
# update the Sinlog logger level
|
|
81
|
+
Sinlog.logger(level: "debug")
|
|
82
|
+
# OR: Sinlog::Logger.logger("debug")
|
|
83
|
+
|
|
84
|
+
Sinlog.dbg 'debug'
|
|
85
|
+
Sinlog.info 'information'
|
|
86
|
+
Sinlog.warn 'warning'
|
|
87
|
+
Sinlog.err 'error'
|
|
88
|
+
Sinlog.fatal 'fatal'
|
|
89
|
+
Sinlog.unk 'unknown'
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
OR:
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
# POSIX-sh
|
|
96
|
+
|
|
97
|
+
# 设置环境变量,YOUR_CUSTOM_LOG 可以改为其他的名称
|
|
98
|
+
export YOUR_CUSTOM_LOG=debug
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```ruby
|
|
102
|
+
# RUBY
|
|
103
|
+
|
|
104
|
+
require 'sinlog'
|
|
105
|
+
|
|
106
|
+
log = Sinlog.logger(env_name: "YOUR_CUSTOM_LOG")
|
|
107
|
+
log.debug "This is a debug message"
|
|
108
|
+
log.info 'information'
|
|
109
|
+
log.warn 'warning'
|
|
110
|
+
log.error 'error'
|
|
111
|
+
log.fatal 'fatal'
|
|
112
|
+
log.unknown 'unknown'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### OOP style
|
|
116
|
+
|
|
117
|
+
```ruby
|
|
118
|
+
require 'sinlog'
|
|
119
|
+
|
|
120
|
+
using Sinlog::Refin
|
|
121
|
+
# OR: include Sinlog::Mixin
|
|
122
|
+
|
|
123
|
+
'debug'.log_dbg
|
|
124
|
+
'information'.log_info
|
|
125
|
+
'warning'.log_warn
|
|
126
|
+
'error'.log_err
|
|
127
|
+
'fatal'.log_fatal
|
|
128
|
+
'unknown'.log_unk
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### FP Style
|
|
132
|
+
|
|
133
|
+
```ruby
|
|
134
|
+
require 'sinlog'
|
|
135
|
+
|
|
136
|
+
# update the Sinlog logger level
|
|
137
|
+
{level: "dbg"}.then { Sinlog.logger **_1 }
|
|
138
|
+
|
|
139
|
+
Log = Sinlog::Proc
|
|
140
|
+
|
|
141
|
+
'debug'.tap &Log.dbg
|
|
142
|
+
# OR: Log.dbg['debug']
|
|
143
|
+
# OR: Log.dbg.call 'debug'
|
|
144
|
+
# OR: Log.dbg.('debug')
|
|
145
|
+
|
|
146
|
+
class Object; def ▷(f) = f.call(self) end
|
|
147
|
+
|
|
148
|
+
true.▷(Log.dbg >> Log.info >> Log.warn >> Log.err >> Log.fatal >> Log.unk)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
## Monkey Patching
|
|
60
153
|
|
|
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` |
|
|
154
|
+
### 对照表
|
|
66
155
|
|
|
156
|
+
| 模块 | Type | Activation | 方法 |
|
|
157
|
+
| ---------- | ---------- | ---------- | -------------------------------------------------------- |
|
|
158
|
+
| Mixin | Mixin | include | log_dbg, log_info, log_warn, log_err, log_fatal, log_unk |
|
|
159
|
+
| Refin | Refinement | using | log_dbg, log_info, log_warn, log_err, log_fatal, log_unk |
|
|
160
|
+
| ShortMixin | Mixin | include | dbg, info, warn, err, fatal, unk |
|
|
161
|
+
| ShortRefin | Refinement | using | dbg, info, warn, err, fatal, unk |
|
|
67
162
|
|
|
68
163
|
### 方法列表
|
|
69
164
|
|
|
70
|
-
####
|
|
165
|
+
#### Mixin & Refin
|
|
71
166
|
|
|
72
167
|
- `log_dbg` – DEBUG
|
|
73
168
|
- `log_info` – INFO
|
|
@@ -76,14 +171,17 @@ gem install sinlog
|
|
|
76
171
|
- `log_fatal` – FATAL
|
|
77
172
|
- `log_unk` – UNKNOWN
|
|
78
173
|
|
|
79
|
-
####
|
|
80
|
-
|
|
81
|
-
LogShortExt 类似于 LogExt。
|
|
174
|
+
#### ShortMixin & ShortRefin
|
|
82
175
|
|
|
83
|
-
|
|
176
|
+
- ShortRefin 类似于 Refin
|
|
177
|
+
- 除了方法的命名不同外,二者的内部实现没有任何区别。
|
|
178
|
+
- Refin 的方法带有 `log_` 前缀
|
|
179
|
+
- ShortRefin 没有
|
|
84
180
|
|
|
85
|
-
-
|
|
86
|
-
-
|
|
181
|
+
- ShortMixin 类似于 Mixin
|
|
182
|
+
- 二者的区别只是命名不同
|
|
183
|
+
- Mixin 的方法带有 `log_` 前缀
|
|
184
|
+
- ShortMixin 没有
|
|
87
185
|
|
|
88
186
|
---
|
|
89
187
|
|
|
@@ -94,52 +192,56 @@ LogShortExt 类似于 LogExt。
|
|
|
94
192
|
- `fatal` – FATAL
|
|
95
193
|
- `unk` – UNKNOWN
|
|
96
194
|
|
|
97
|
-
> ⚠️ 由于
|
|
98
|
-
> 对于 ruby 代码中的 `warn "msg"
|
|
195
|
+
> ⚠️ 由于 ShortMixin & ShortRefin 带有 warn 方法,因此会覆盖 warn。
|
|
196
|
+
> 对于 ruby 代码中的 `warn "msg"` (输出到 stderr 而非输出为日志格式),您可能需要手动将其修改为 `Kernel.warn "msg"`。
|
|
99
197
|
>
|
|
100
|
-
> 如果介意的话,那就使用 `using Sinlog::
|
|
198
|
+
> 如果介意的话,那就使用 `using Sinlog::Refin` 而不是 `using Sinlog::ShortRefin`。
|
|
101
199
|
|
|
102
200
|
### 例子
|
|
103
201
|
|
|
104
|
-
####
|
|
202
|
+
#### Refinement
|
|
105
203
|
|
|
106
204
|
```ruby
|
|
107
205
|
require 'sinlog'
|
|
206
|
+
using Sinlog::Refin
|
|
207
|
+
{ dir: "/path/to/xx" }.log_info
|
|
208
|
+
```
|
|
108
209
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
210
|
+
```ruby
|
|
211
|
+
require 'sinlog'
|
|
212
|
+
using Sinlog::ShortRefin
|
|
213
|
+
{ dir: "/path/to/xx" }.info
|
|
112
214
|
```
|
|
113
215
|
|
|
114
216
|
#### Mixin
|
|
115
217
|
|
|
116
218
|
```ruby
|
|
117
219
|
require 'sinlog'
|
|
118
|
-
include Sinlog::
|
|
220
|
+
include Sinlog::Mixin
|
|
119
221
|
"Hello".log_info
|
|
120
222
|
```
|
|
121
|
-
#### Refinement
|
|
122
223
|
|
|
123
224
|
```ruby
|
|
124
225
|
require 'sinlog'
|
|
125
|
-
|
|
126
|
-
|
|
226
|
+
include Sinlog::ShortMixin
|
|
227
|
+
"Hello".info
|
|
127
228
|
```
|
|
128
229
|
|
|
129
230
|
## Learn Sinlog API By Example
|
|
130
231
|
|
|
131
|
-
<img src="../assets/img/预览.
|
|
232
|
+
<img src="../misc/assets/img/预览.webp" alt="预览">
|
|
132
233
|
|
|
133
234
|
```ruby
|
|
134
235
|
require 'sinlog'
|
|
135
236
|
|
|
136
|
-
|
|
137
|
-
|
|
237
|
+
module A
|
|
238
|
+
module_function
|
|
239
|
+
using Sinlog::ShortRefin
|
|
138
240
|
|
|
139
|
-
def
|
|
140
|
-
'
|
|
141
|
-
您可能会觉得我有点啰嗦,哈哈哈!'.dbg
|
|
142
|
-
'
|
|
241
|
+
def log
|
|
242
|
+
['喂喂喂123,能看到这条调试消息吗?',
|
|
243
|
+
'您可能会觉得我有点啰嗦,哈哈哈!'].dbg
|
|
244
|
+
'神经,害我笑了一下。'.info
|
|
143
245
|
|
|
144
246
|
'开门!查水表。'.warn
|
|
145
247
|
{ error: "IO", type: "输入数据无效" }.err
|
|
@@ -148,41 +250,15 @@ class A
|
|
|
148
250
|
end
|
|
149
251
|
end
|
|
150
252
|
|
|
151
|
-
Sinlog::LV[:info].then do
|
|
152
|
-
Sinlog.logger_with_level it
|
|
153
|
-
end
|
|
154
253
|
|
|
155
254
|
A.log
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Classic Method Call
|
|
159
|
-
|
|
160
|
-
您如果不喜欢 `msg.info` 这种做法 ,那不妨试试经典的方法调用吧!(i.e., `log.info(msg)`)
|
|
161
255
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
log
|
|
166
|
-
|
|
167
|
-
log.debug 'debug'
|
|
168
|
-
log.info 'information'
|
|
169
|
-
log.warn 'warning'
|
|
170
|
-
log.error 'error'
|
|
171
|
-
log.fatal 'fatal'
|
|
172
|
-
log.unknown 'unknown'
|
|
256
|
+
# 修改日志级别为 error
|
|
257
|
+
Sinlog.logger(level: 'err')
|
|
258
|
+
Kernel.warn 'Logger.level => error'
|
|
259
|
+
A.log
|
|
173
260
|
```
|
|
174
261
|
|
|
175
|
-
> `Sinlog.logger` 的数据类型为 ruby 标准库的 Logger。
|
|
176
|
-
|
|
177
|
-
除了以下这些常见的方法外,您还可以使用 `.reopen` 等其他的方法,详见 <https://docs.ruby-lang.org.cn/en/3.4/Logger.html>
|
|
178
|
-
|
|
179
|
-
- debug
|
|
180
|
-
- info
|
|
181
|
-
- warn
|
|
182
|
-
- error
|
|
183
|
-
- fatal
|
|
184
|
-
- unknown
|
|
185
|
-
|
|
186
262
|
## 进阶
|
|
187
263
|
|
|
188
264
|
在亲自上手尝试之后,我们已经对 sinlog 有了初步的了解。
|
|
@@ -200,7 +276,8 @@ require 'sinlog'
|
|
|
200
276
|
class EpubProcessor
|
|
201
277
|
def initialize(epub_file, logger = nil)
|
|
202
278
|
@epub = epub_file
|
|
203
|
-
|
|
279
|
+
logger ||= Sinlog::logger(env_name: "XX_LOG")
|
|
280
|
+
@logger = logger
|
|
204
281
|
@logger.debug "EpubProcessor class 初始化完成。"
|
|
205
282
|
end
|
|
206
283
|
end
|
|
@@ -223,17 +300,18 @@ end
|
|
|
223
300
|
- fatal = 4
|
|
224
301
|
- unknown = 5
|
|
225
302
|
|
|
303
|
+
> 有意思的一点是: ruby 的标准库的 logger 的日志级别与 rust 的 [log::Level](https://docs.rs/log/latest/log/enum.Level.html) 是相反的。
|
|
304
|
+
|
|
226
305
|
```ruby
|
|
227
306
|
p Sinlog::LV
|
|
228
307
|
# => {debug: 0, info: 1, warn: 2, error: 3, fatal: 4, unknown: 5}
|
|
229
308
|
|
|
230
309
|
# 将日志级别修改为 warn
|
|
231
|
-
log = Sinlog.
|
|
310
|
+
log = Sinlog.logger(level: 'warn')
|
|
232
311
|
# OR:
|
|
233
|
-
# log = Sinlog.logger
|
|
312
|
+
# log = Sinlog.logger(level: Sinlog::LV[:warn])
|
|
234
313
|
# OR:
|
|
235
|
-
# log = Sinlog.
|
|
236
|
-
|
|
314
|
+
# log = Sinlog.logger.tap { it.level = 2 }
|
|
237
315
|
|
|
238
316
|
log.error "这条消息会显示出来!低级别 WARN(2)会显示高级别 ERROR(3) 的日志。"
|
|
239
317
|
log.info "这条消息不会显示出来!高级别 WARN(2) 不会显示低级别 INFO(1) 的日志。"
|
|
@@ -250,13 +328,11 @@ log.info "这条消息不会显示出来!高级别 WARN(2) 不会显示低级
|
|
|
250
328
|
|
|
251
329
|
> 使用环境变量足够简单也足够高效。
|
|
252
330
|
|
|
253
|
-
Sinlog
|
|
254
|
-
|
|
255
|
-
本质上调用了 `set_level_from_env!(env_name = 'RUBY_LOG')` 函数。
|
|
331
|
+
`Sinlog::Logger` 在初始化时,会尝试读取环境变量 `RUBY_LOG` 的值。
|
|
256
332
|
|
|
257
333
|
- 若该环境变量不存在,则使用 debug(0)。
|
|
258
|
-
- 若该环境变量存在,且其值为空,则使用
|
|
259
|
-
- 若该环境变量的值无效,则使用
|
|
334
|
+
- 若该环境变量存在,且其值为空,则使用 error(3)。
|
|
335
|
+
- 若该环境变量的值无效,则使用 error(3)。
|
|
260
336
|
|
|
261
337
|
我们可以用 POSIX-sh 设置环境变量,然后 logger 在初始化的时候,就会自动将日志级别设置为(RUBY_LOG的值)warn。
|
|
262
338
|
|
|
@@ -276,7 +352,7 @@ export XX_CLI_LOG=info
|
|
|
276
352
|
ruby:
|
|
277
353
|
|
|
278
354
|
```ruby
|
|
279
|
-
logger = Sinlog.
|
|
355
|
+
logger = Sinlog.logger(env_name:"XX_CLI_LOG")
|
|
280
356
|
|
|
281
357
|
logger.debug "由于当前日志级别为 INFO(1),因此不会显示此消息 DEBUG(0)。"
|
|
282
358
|
logger.info "Hello!"
|
|
@@ -284,7 +360,9 @@ logger.info "Hello!"
|
|
|
284
360
|
|
|
285
361
|
### 日志输出设备/路径
|
|
286
362
|
|
|
287
|
-
默认情况下,Sinlog 会输出到 STDERR
|
|
363
|
+
默认情况下,Sinlog 会输出到 `STDERR`。
|
|
364
|
+
|
|
365
|
+
> `Sinlog.logger` 的数据类型为 ruby 标准库的 Logger。
|
|
288
366
|
|
|
289
367
|
您如果需要自定义日志输出路径的话,那可以调用 logger 的 reopen 方法。
|
|
290
368
|
|
|
@@ -308,11 +386,13 @@ log.error "发生甚么事了!QuQ"
|
|
|
308
386
|
|
|
309
387
|
除了 `.reopen`, `.level` 外,我们还可以在 `Sinlog.logger` 上调用 ruby 标准库的 logger 的其他方法。
|
|
310
388
|
|
|
389
|
+
详见 <https://docs.ruby-lang.org.cn/en/3.4/Logger.html>
|
|
390
|
+
|
|
311
391
|
### 注意事项
|
|
312
392
|
|
|
313
|
-
Sinlog 用的是 Singleton 单例模式,整个程序会共享同一个实例(日志记录器)。
|
|
393
|
+
`Sinlog::Logger` 用的是 Singleton 单例模式,整个程序会共享同一个实例(日志记录器)。
|
|
314
394
|
|
|
315
|
-
在同一个程序的 class A 中修改 Sinlog 后,会影响到 class B 的 Sinlog
|
|
395
|
+
在同一个程序的 class A 中修改 `Sinlog.logger` (a.k.a. `Sinlog::Logger.instance.logger`) 后,会影响到 class B 的 `Sinlog::Logger`。
|
|
316
396
|
|
|
317
397
|
## 题外话
|
|
318
398
|
|