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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ecaf58b7c3bf5c9aa786298cb6bb04c3ab71765a1505eba61d434215843d37f
4
- data.tar.gz: fbede6f56a92ef23bfd35a1f28672697d7a63a72b246c515fc374375ec5e030d
3
+ metadata.gz: 7b6ddc12bba2068f177da14004c4c8d809576a7fd03447ee5dae69fb19d9697b
4
+ data.tar.gz: 8dec27b670c17916d872d6d36a647ee95080375fc01b78933e334bb1219c3578
5
5
  SHA512:
6
- metadata.gz: 0f9b7726ec4ae07cdb03933f6e9aa949906cd439a6fe5d1f29da92a1a7f3690460d0a21ff98c059b1b1d4a5bf2b0a9bf852cd3d4dcf373f9c81a564bbbcb5a53
7
- data.tar.gz: ff0e2041be04f159a26dd621027d8c64f491f72a3f7de496c4355a53431eaabb61d45f00805628315fa85221278a3f2fcebc2ca060df7cbe7fc0abcd03dacb2e
6
+ metadata.gz: f7af956f2543e0b4232f1e5a13b6d7c50bbb0a76e1e3ba4f93ae0e3d9fbd62f853c4e04edc176c7bec77e8cd5040d36b6d3c3b521b5a32091ef63824cada8a17
7
+ data.tar.gz: 61ae061833061c93ada7731fec870e9fc70df91f0f6be904aa6165eacbc745a8b876a153c8b941b3b26b4e9177169ffaae47720579e60c50512f9f56ce2a3670
data/License CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2025 2moe
3
+ Copyright (c) 2025 Moe<m@tmoe.me>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/docs/Readme-zh.md CHANGED
@@ -4,6 +4,9 @@
4
4
 
5
5
  > 单例(Singleton)意味着整个程序会共享同一个实例(日志记录器)。
6
6
 
7
+ [![Gem Version](https://badge.fury.io/rb/sinlog.svg?icon=si%3Arubygems)](https://rubygems.org/gems/sinlog)
8
+ <!-- [![RubyDoc](https://img.shields.io/badge/-y?label=rubydoc&color=orange)](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
- ## Learn Sinlog API By Example
49
+ ## 快速上手
40
50
 
41
- 首先,安装 sinlog。
51
+ ## 安装
42
52
 
43
53
  ```sh
54
+ # POSIX-sh
55
+ #
44
56
  gem install sinlog
45
57
  ```
46
58
 
47
- 然后,我们可以运行 `irb` 来快速体验一番。
59
+ ### 对比
48
60
 
49
- ### include module
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
- 当出现: `irb(main):001>` 后,我们就能开始操作了。
68
+ ### 方法列表
54
69
 
55
- ```ruby
56
- irb(main):001> require 'sinlog'
70
+ #### Loggable & LogExt
57
71
 
58
- irb(main):002> include Sinlog::LambdaExt
59
- # 它提供了: dbg, info, warning, err, fatal, unk
60
- # 我们可以用 .tap(&dbg) 或 .then(&dbg) 来调用。
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
- irb(main):003> 'debug'.tap(&dbg)
63
- irb(main):004> 'information'.tap(&info)
79
+ #### LogShortExt
64
80
 
65
- # 注:创建 warn 方法,会导致 irb 的补全功能出问题。
66
- # 因此 LambdaExt 用的是 warning, 而不是 warn。
67
- # 您如果确实需要 warn,那就调用 include Sinlog::LambdaWarnExt
68
- irb(main):005> 'warning'.tap(&warning)
81
+ LogShortExt 类似于 LogExt。
69
82
 
70
- irb(main):006> 'error'.tap(&err)
71
- irb(main):007> 'fatal'.tap(&fatal)
72
- irb(main):008> 'unknown'.tap(&unk)
73
- ```
83
+ 除了方法的命名不同外,二者的内部实现没有任何区别。
74
84
 
75
- <img src="../assets/img/LambdaExt.jpg" alt="LambdaExt" style="width: 50%; height: 50%">
85
+ - LogExt 的方法带有 `log_` 前缀
86
+ - LogShortExt 没有
76
87
 
77
- LambdaExt 提供了:
88
+ ---
78
89
 
79
- - dbg
80
- - info
81
- - warning
82
- - wng (与 warning 相同,只是名称不同)
83
- - err
84
- - fatal
85
- - unk
90
+ - `dbg` – DEBUG
91
+ - `info` – INFO
92
+ - `warn` – WARN
93
+ - `err` – ERROR
94
+ - `fatal` – FATAL
95
+ - `unk` – UNKNOWN
86
96
 
87
- #### LogLambdaExt
97
+ > ⚠️ 由于 LogShortExt 带有 warn 方法,因此会覆盖 warn。
98
+ > 对于 ruby 代码中的 `warn "msg"`,您可能需要手动将其修改为 `Kernel.warn "msg"`
99
+ >
100
+ > 如果介意的话,那就使用 `using Sinlog::LogExt` 而不是 `using Sinlog::LogShortExt`。
88
101
 
89
- 有一个与 LambdaExt 特别相似的模块,名为 LogLambdaExt。
90
- 它们之间最主要的区别在于 lambda 函数的名称。
102
+ ### 例子
91
103
 
92
- - LogLambdaExt 带有 `log_` 前缀
93
- - LambdaExt 没有
104
+ #### 经典方法调用 (非 mixin,亦非 refinement)
94
105
 
95
- LambdaExt 与 LogLambdaExt 可以同时 include, 不过在一般情况下,我们引入其中一个就够用了。
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
- irb(main):009> include Sinlog::LogLambdaExt
103
- # 它提供了 log_dbg, log_info, log_warn, log_err, log_fatal, log_unk
104
- # 我们可以用 .tap(&log_dbg) 或 .then(&log_dbg) 来调用。
117
+ require 'sinlog'
118
+ include Sinlog::Loggable
119
+ "Hello".log_info
120
+ ```
121
+ #### Refinement
105
122
 
106
- irb(main):010> "debug".tap(&log_dbg)
107
- irb(main):011> "information".tap(&log_info)
123
+ ```ruby
124
+ require 'sinlog'
125
+ using Sinlog::LogExt
126
+ { dir: "/path/to/xx" }.log_info
127
+ ```
108
128
 
109
- # 注:这里用的是 log_warn,而不是 log_warning
110
- irb(main):012> "warning".tap(&log_warn)
129
+ ## Learn Sinlog API By Example
111
130
 
112
- irb(main):013> "error".tap(&log_err)
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
- <img src="../assets/img/LogLambdaExt.jpg" alt="LogLambdaExt" style="width: 90%; height: 90%">
136
+ class A
137
+ using Sinlog::LogShortExt
132
138
 
133
- LogLambdaExt 提供了:
139
+ def self.log
140
+ '您好,我是一条调试消息。
141
+ 您可能会觉得我有点啰嗦,哈哈哈!'.dbg
142
+ '神经,害我笑了一下'.info
134
143
 
135
- - log_dbg
136
- - log_info
137
- - log_warn
138
- - log_warning (与 log_warn 相同,只是名称不同)
139
- - log_wng (与 log_warn 相同,只是名称不同)
140
- - log_err
141
- - log_fatal
142
- - log_unk
144
+ '开门!查水表。'.warn
145
+ { error: "IO", type: "输入数据无效" }.err
146
+ '不行啦!出错了,继续运行下去会坏掉的。'.err
147
+ '滋滋滋,已经坏..掉...了..了~'.fatal
148
+ end
149
+ end
143
150
 
144
- ### Classic Method Call
151
+ Sinlog::LV[:info].then do
152
+ Sinlog.logger_with_level it
153
+ end
154
+
155
+ A.log
156
+ ```
145
157
 
146
- 您如果不喜欢 lambda,那就试试经典的方法调用吧!
158
+ ### Classic Method Call
147
159
 
148
- 先运行 irb 进入 ruby repl,接着一步一步运行。
160
+ 您如果不喜欢 `msg.info` 这种做法 ,那不妨试试经典的方法调用吧!(i.e., `log.info(msg)`)
149
161
 
150
162
  ```ruby
151
- irb(main):001> require 'sinlog'
163
+ require 'sinlog'
152
164
 
153
- irb(main):002> log = Sinlog.instance.logger
165
+ log = Sinlog.logger
154
166
 
155
- irb(main):003> log.debug 'debug'
156
- irb(main):004> log.info 'information'
157
- irb(main):005> log.warn 'warning'
158
- irb(main):006> log.error 'error'
159
- irb(main):007> log.fatal 'fatal'
160
- irb(main):008> log.unknown 'unknown'
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.instance.logger 提供了 ruby 标准库的 logger 的方法。
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.fetch_env_and_update_log_level("XX_LOG") }.logger
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.instance.logger.tap {it.level = Sinlog::LV[:warn]}
221
- # 或者是:
222
- # log = Sinlog.instance.logger.tap {it.level = 2}
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
- 本质上调用了 `fetch_env_and_update_log_level(env_name = 'RUBY_LOG')` 函数。
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.fetch_env_and_update_log_level("XX_CLI_LOG") }.logger
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.instance.logger.tap {it.reopen("a.log")}
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.instance.logger
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.instance.logger` 上调用 ruby 标准库的 logger 的其他方法。
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