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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f34c532f5dee51480976b05ef2257a4cbd6555c8ef7af54430a26890f57510bf
4
- data.tar.gz: 36abd9cb6265627faf12bde9cdf3a8ccce0fde6c904032b15dd05f235bdab916
3
+ metadata.gz: 17e9888bbb5141e0cea455861ecb8f138f6e84d5d1cd6bcd12e6ebc7e471850f
4
+ data.tar.gz: 4c042bae2dd42b2340160dccb99a64cdde3c63746f39da5c0cc19ff8094d3d95
5
5
  SHA512:
6
- metadata.gz: 0c2274a0d751ede93a7d022a4099cb2b53e842905d71d96ed56c45dc6f001d3767805c71c20c6a8713ab2ef2114c2a253cba2c10f9aeb12364809de682babbd7
7
- data.tar.gz: 9fd628020647f1f341aaf747033eeb94d00f7624491a59078a4bc3a931b45536fc21083c14cf44f4a4d0ab1f1c7cbcbe68cc915f97cb657e2c60869ceb1deabd
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
- - [Loggable \& LogExt](#loggable--logext)
30
- - [LogShortExt](#logshortext)
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
+ ![ClassDiagram](../misc/assets/svg/ClassDiagram.svg)
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
- #### Loggable & LogExt
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
- #### LogShortExt
80
-
81
- LogShortExt 类似于 LogExt。
174
+ #### ShortMixin & ShortRefin
82
175
 
83
- 除了方法的命名不同外,二者的内部实现没有任何区别。
176
+ - ShortRefin 类似于 Refin
177
+ - 除了方法的命名不同外,二者的内部实现没有任何区别。
178
+ - Refin 的方法带有 `log_` 前缀
179
+ - ShortRefin 没有
84
180
 
85
- - LogExt 的方法带有 `log_` 前缀
86
- - LogShortExt 没有
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
- > ⚠️ 由于 LogShortExt 带有 warn 方法,因此会覆盖 warn。
98
- > 对于 ruby 代码中的 `warn "msg"`,您可能需要手动将其修改为 `Kernel.warn "msg"`
195
+ > ⚠️ 由于 ShortMixin & ShortRefin 带有 warn 方法,因此会覆盖 warn。
196
+ > 对于 ruby 代码中的 `warn "msg"` (输出到 stderr 而非输出为日志格式),您可能需要手动将其修改为 `Kernel.warn "msg"`。
99
197
  >
100
- > 如果介意的话,那就使用 `using Sinlog::LogExt` 而不是 `using Sinlog::LogShortExt`。
198
+ > 如果介意的话,那就使用 `using Sinlog::Refin` 而不是 `using Sinlog::ShortRefin`。
101
199
 
102
200
  ### 例子
103
201
 
104
- #### 经典方法调用 (非 mixin,亦非 refinement)
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
- log = Sinlog.logger
110
- log.info "Information"
111
- log.debug "This is a debug message"
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::Loggable
220
+ include Sinlog::Mixin
119
221
  "Hello".log_info
120
222
  ```
121
- #### Refinement
122
223
 
123
224
  ```ruby
124
225
  require 'sinlog'
125
- using Sinlog::LogExt
126
- { dir: "/path/to/xx" }.log_info
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/预览.png" alt="预览">
232
+ <img src="../misc/assets/img/预览.webp" alt="预览">
132
233
 
133
234
  ```ruby
134
235
  require 'sinlog'
135
236
 
136
- class A
137
- using Sinlog::LogShortExt
237
+ module A
238
+ module_function
239
+ using Sinlog::ShortRefin
138
240
 
139
- def self.log
140
- '您好,我是一条调试消息。
141
- 您可能会觉得我有点啰嗦,哈哈哈!'.dbg
142
- '神经,害我笑了一下'.info
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
- ```ruby
163
- require 'sinlog'
164
-
165
- log = Sinlog.logger
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
- @logger = logger || Sinlog.instance.tap { it.set_level_from_env!("XX_LOG") }.logger
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.logger_with_level(Sinlog::LV[:warn])
310
+ log = Sinlog.logger(level: 'warn')
232
311
  # OR:
233
- # log = Sinlog.logger.tap { it.level = Sinlog::LV[:warn] }
312
+ # log = Sinlog.logger(level: Sinlog::LV[:warn])
234
313
  # OR:
235
- # log = Sinlog.instance.logger.tap { it.level = 2 }
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 在默认情况下,会尝试读取环境变量 RUBY_LOG 的值。
254
-
255
- 本质上调用了 `set_level_from_env!(env_name = 'RUBY_LOG')` 函数。
331
+ `Sinlog::Logger` 在初始化时,会尝试读取环境变量 `RUBY_LOG` 的值。
256
332
 
257
333
  - 若该环境变量不存在,则使用 debug(0)。
258
- - 若该环境变量存在,且其值为空,则使用 unknown(5)。
259
- - 若该环境变量的值无效,则使用 unknown(5)。
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.instance.tap { it.set_level_from_env!("XX_CLI_LOG") }.logger
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