tty-logger 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -1
- data/README.md +16 -4
- data/lib/tty/logger.rb +6 -4
- data/lib/tty/logger/config.rb +5 -8
- data/lib/tty/logger/data_filter.rb +3 -6
- data/lib/tty/logger/formatters/json.rb +3 -4
- data/lib/tty/logger/formatters/text.rb +7 -6
- data/lib/tty/logger/handlers/console.rb +17 -6
- data/lib/tty/logger/levels.rb +2 -1
- data/lib/tty/logger/version.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0594c7ef471a07571e5621e8535469fcb50edeeb10d7ffa58b194ef8fe4f8350'
|
4
|
+
data.tar.gz: 42a3b6c20b756754723c42c5b0ce85490b403978ffe566cb267dc6f18811f1c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fb46bcc0515d4f4762dc9c601b65131a493153ed85e48e83ac64ae70b0b2060d0780d867560bfc8e50ed4c461ea62e1aeba5b4e1b6b55572656196e9958840b
|
7
|
+
data.tar.gz: 235421d689aa362a858a813fd369cef67673b0c6b13ccf50f6733a603746c3dfc00bde16fdd73fb1dd4358e9457c70d61c033c60d409e3f721eb0b34cc5c40bd
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
-
## [v0.
|
3
|
+
## [v0.5.0] - 2020-09-27
|
4
4
|
|
5
5
|
### Added
|
6
|
+
* Add :message_format option to customize how messages are displayed in the console
|
7
|
+
by Josh Greenwood (@JoshTGreenwood)
|
8
|
+
|
9
|
+
### Fixed
|
10
|
+
* Fix to select event name from valid log types or current level
|
11
|
+
by Ryan Schlesinger (@ryansch)
|
12
|
+
* Fix duplicate filters attribute definition in TTY::Logger::Config
|
6
13
|
|
14
|
+
## [v0.4.0] - 2020-07-29
|
15
|
+
|
16
|
+
### Added
|
7
17
|
* Allow editing logger configuration at runtime ([#10](https://github.com/piotrmurach/tty-logger/pull/10))
|
8
18
|
* Support for the `<<` streaming operator ([#9](https://github.com/piotrmurach/tty-logger/pull/9)))
|
9
19
|
|
@@ -40,6 +50,7 @@
|
|
40
50
|
|
41
51
|
* Initial implementation and release
|
42
52
|
|
53
|
+
[v0.5.0]: https://github.com/piotrmurach/tty-logger/compare/v0.4.0..v0.5.0
|
43
54
|
[v0.4.0]: https://github.com/piotrmurach/tty-logger/compare/v0.3.0..v0.4.0
|
44
55
|
[v0.3.0]: https://github.com/piotrmurach/tty-logger/compare/v0.2.0..v0.3.0
|
45
56
|
[v0.2.0]: https://github.com/piotrmurach/tty-logger/compare/v0.1.0..v0.2.0
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<div align="center">
|
2
|
-
<a href="https://
|
2
|
+
<a href="https://ttytoolkit.org" target="_blank"><img width="130" src="https://github.com/piotrmurach/tty/raw/master/images/tty.png" alt="tty logo" /></a>
|
3
3
|
</div>
|
4
4
|
|
5
5
|
# TTY::Logger [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter]
|
@@ -42,7 +42,7 @@
|
|
42
42
|
Add this line to your application's Gemfile:
|
43
43
|
|
44
44
|
```ruby
|
45
|
-
gem
|
45
|
+
gem "tty-logger"
|
46
46
|
```
|
47
47
|
|
48
48
|
And then execute:
|
@@ -62,7 +62,7 @@ Or install it yourself as:
|
|
62
62
|
* [2.1.1 Exceptions](#211-exceptions)
|
63
63
|
* [2.1.2 Types](#212-types)
|
64
64
|
* [2.2 Levels](#22-levels)
|
65
|
-
* [2.2.1 Scoped Level](#22-scoped-
|
65
|
+
* [2.2.1 Scoped Level](#22-scoped-level)
|
66
66
|
* [2.3 Structured Data](#23-structured-data)
|
67
67
|
* [2.4 Configuration](#24-configuration)
|
68
68
|
* [2.4.1 Metadata](#241-metadata)
|
@@ -294,7 +294,7 @@ end
|
|
294
294
|
# • debug logged
|
295
295
|
```
|
296
296
|
|
297
|
-
Or
|
297
|
+
Or elevate a level to an error with a constant `ERROR_LEVEL`:
|
298
298
|
|
299
299
|
```ruby
|
300
300
|
logger.log_at TTY::Logger::ERROR_LEVEL do
|
@@ -346,6 +346,8 @@ All the configuration options can be changed globally via `configure` or per log
|
|
346
346
|
* `:max_depth` - the maximum depth for nested structured data. Defaults to `3`.
|
347
347
|
* `:metadata` - the meta info to display before the message, can be `:pid`, `:date`, `:time` or `:file`. Defaults to empty array `[]`, no metadata. Setting this to `:all` will print all the metadata.
|
348
348
|
* `:types` - the new custom log types. Defaults to `{}`.
|
349
|
+
* `:date_format` - uses `strftime` format to display dates. Defaults to `"%F"`.
|
350
|
+
* `:time_format` - uses `strftime` format to display times. Defaults to `"%T.%3N"`.
|
349
351
|
|
350
352
|
For example, to configure `:max_bytes`, `:level` and `:metadata` for all logger instances do:
|
351
353
|
|
@@ -549,6 +551,7 @@ The console handler prints log messages to the console. It supports the followin
|
|
549
551
|
* `:styles` - a hash of styling options.
|
550
552
|
* `:formatter` - the formatter for log messages. Defaults to `:text`
|
551
553
|
* `:output` - the device to log error messages to. Defaults to `$stderr`
|
554
|
+
* `:message_format` - uses `sprintf` format to display messages. Defaults to `"%-25s"`.
|
552
555
|
|
553
556
|
The supported options in the `:styles` are:
|
554
557
|
|
@@ -604,6 +607,15 @@ styled_logger.error("Custom error")
|
|
604
607
|
# ! Dooh Custom error
|
605
608
|
```
|
606
609
|
|
610
|
+
To increase message padding to a percentage of terminal width (depends on [tty-screen](https://github.com/piotrmurach/tty-screen/)):
|
611
|
+
|
612
|
+
```ruby
|
613
|
+
TTY::Logger.new do |config|
|
614
|
+
padding = (TTY::Screen.columns * 0.4).to_i
|
615
|
+
config.handlers = [[:console, { message_format: "%-#{padding}s" }]]
|
616
|
+
end
|
617
|
+
```
|
618
|
+
|
607
619
|
#### 2.6.2 Stream handler
|
608
620
|
|
609
621
|
To send log event data outside of console to another service or `IO` stream, you can use `:stream` handler.
|
data/lib/tty/logger.rb
CHANGED
@@ -104,6 +104,7 @@ module TTY
|
|
104
104
|
@data_filter = DataFilter.new(@config.filters.data,
|
105
105
|
mask: @config.filters.mask)
|
106
106
|
|
107
|
+
@types = LOG_TYPES.dup
|
107
108
|
@config.types.each do |name, log_level|
|
108
109
|
add_type(name, log_level)
|
109
110
|
end
|
@@ -120,9 +121,11 @@ module TTY
|
|
120
121
|
#
|
121
122
|
# @api private
|
122
123
|
def add_type(name, log_level)
|
123
|
-
if
|
124
|
+
if @types.include?(name)
|
124
125
|
raise Error, "Already defined log type #{name.inspect}"
|
125
126
|
end
|
127
|
+
|
128
|
+
@types[name.to_sym] = log_level
|
126
129
|
self.class.define_level(name, log_level)
|
127
130
|
end
|
128
131
|
|
@@ -226,8 +229,7 @@ module TTY
|
|
226
229
|
|
227
230
|
self
|
228
231
|
end
|
229
|
-
|
230
|
-
alias_method :<<, :write
|
232
|
+
alias << write
|
231
233
|
|
232
234
|
# Log a message given the severtiy level
|
233
235
|
#
|
@@ -254,7 +256,7 @@ module TTY
|
|
254
256
|
level: current_level,
|
255
257
|
time: Time.now,
|
256
258
|
pid: Process.pid,
|
257
|
-
name:
|
259
|
+
name: @types.include?(label.to_sym) ? label : current_level,
|
258
260
|
path: loc.path,
|
259
261
|
lineno: loc.lineno,
|
260
262
|
method: loc.base_label
|
data/lib/tty/logger/config.rb
CHANGED
@@ -7,15 +7,12 @@ module TTY
|
|
7
7
|
class Config
|
8
8
|
FILTERED = "[FILTERED]"
|
9
9
|
|
10
|
-
# The format used for date display
|
10
|
+
# The format used for date display. uses strftime format
|
11
11
|
attr_accessor :date_format
|
12
12
|
|
13
|
-
# The format used for time display
|
13
|
+
# The format used for time display. uses strftime format
|
14
14
|
attr_accessor :time_format
|
15
15
|
|
16
|
-
# The filters to hide sensitive data from the messages and data.
|
17
|
-
attr_accessor :filters
|
18
|
-
|
19
16
|
# The format used for displaying structured data
|
20
17
|
attr_accessor :formatter
|
21
18
|
|
@@ -28,7 +25,7 @@ module TTY
|
|
28
25
|
# The maximum message size to be logged in bytes. Defaults to 8192
|
29
26
|
attr_accessor :max_bytes
|
30
27
|
|
31
|
-
# The maximum depth for
|
28
|
+
# The maximum depth for formatting array and hash objects. Defaults to 3
|
32
29
|
attr_accessor :max_depth
|
33
30
|
|
34
31
|
# The meta info to display, can be :date, :time, :file, :pid. Defaults to []
|
@@ -66,7 +63,7 @@ module TTY
|
|
66
63
|
end
|
67
64
|
|
68
65
|
def to_h
|
69
|
-
{message: @message, data: @data, mask: @mask}
|
66
|
+
{ message: @message, data: @data, mask: @mask }
|
70
67
|
end
|
71
68
|
|
72
69
|
def to_s
|
@@ -92,6 +89,7 @@ module TTY
|
|
92
89
|
def to_proc
|
93
90
|
-> (config) {
|
94
91
|
config.date_format = @date_format.dup
|
92
|
+
config.time_format = @time_format.dup
|
95
93
|
config.filters = @filters.dup
|
96
94
|
config.formatter = @formatter
|
97
95
|
config.handlers = @handlers.dup
|
@@ -100,7 +98,6 @@ module TTY
|
|
100
98
|
config.max_depth = @max_depth
|
101
99
|
config.metadata = @metadata.dup
|
102
100
|
config.output = @output.dup
|
103
|
-
config.time_format = @time_format.dup
|
104
101
|
config.types = @types.dup
|
105
102
|
config
|
106
103
|
}
|
@@ -37,11 +37,9 @@ module TTY
|
|
37
37
|
def filter(obj)
|
38
38
|
return obj if filters.empty?
|
39
39
|
|
40
|
-
|
40
|
+
obj.each_with_object({}) do |(k, v), acc|
|
41
41
|
acc[k] = filter_val(k, v)
|
42
|
-
acc
|
43
42
|
end
|
44
|
-
hash
|
45
43
|
end
|
46
44
|
|
47
45
|
private
|
@@ -50,7 +48,7 @@ module TTY
|
|
50
48
|
compiled = {
|
51
49
|
regexps: [],
|
52
50
|
nested_regexps: [],
|
53
|
-
blocks: []
|
51
|
+
blocks: []
|
54
52
|
}
|
55
53
|
strings = []
|
56
54
|
nested_strings = []
|
@@ -105,9 +103,8 @@ module TTY
|
|
105
103
|
end
|
106
104
|
|
107
105
|
def filter_obj(_key, obj, composite)
|
108
|
-
obj.
|
106
|
+
obj.each_with_object({}) do |(k, v), acc|
|
109
107
|
acc[k] = filter_val(k, v, composite)
|
110
|
-
acc
|
111
108
|
end
|
112
109
|
end
|
113
110
|
|
@@ -20,7 +20,7 @@ module TTY
|
|
20
20
|
def dump(obj, max_bytes: 2**12, max_depth: 3)
|
21
21
|
bytesize = 0
|
22
22
|
|
23
|
-
hash = obj.
|
23
|
+
hash = obj.each_with_object({}) do |(k, v), acc|
|
24
24
|
str = (k.to_json + v.to_json)
|
25
25
|
items = acc.keys.size - 1
|
26
26
|
|
@@ -31,7 +31,6 @@ module TTY
|
|
31
31
|
bytesize += str.bytesize
|
32
32
|
acc[k] = dump_val(v, max_depth)
|
33
33
|
end
|
34
|
-
acc
|
35
34
|
end
|
36
35
|
::JSON.generate(hash)
|
37
36
|
end
|
@@ -50,13 +49,13 @@ module TTY
|
|
50
49
|
def enc_obj(obj, depth)
|
51
50
|
return ELLIPSIS if depth.zero?
|
52
51
|
|
53
|
-
obj.
|
52
|
+
obj.each_with_object({}) { |(k, v), acc| acc[k] = dump_val(v, depth) }
|
54
53
|
end
|
55
54
|
|
56
55
|
def enc_arr(obj, depth)
|
57
56
|
return ELLIPSIS if depth.zero?
|
58
57
|
|
59
|
-
obj.
|
58
|
+
obj.each_with_object([]) { |v, acc| acc << dump_val(v, depth) }
|
60
59
|
end
|
61
60
|
end # JSON
|
62
61
|
end # Formatters
|
@@ -32,12 +32,13 @@ module TTY
|
|
32
32
|
def dump(obj, max_bytes: 2**12, max_depth: 3)
|
33
33
|
bytesize = 0
|
34
34
|
|
35
|
-
line = obj.
|
35
|
+
line = obj.each_with_object([]) do |(k, v), acc|
|
36
36
|
str = "#{dump_key(k)}=#{dump_val(v, max_depth)}"
|
37
37
|
items = acc.size - 1
|
38
38
|
|
39
39
|
if bytesize + str.bytesize + items > max_bytes
|
40
|
-
if bytesize + items +
|
40
|
+
if bytesize + items +
|
41
|
+
(acc[-1].bytesize - ELLIPSIS.bytesize) > max_bytes
|
41
42
|
acc.pop
|
42
43
|
end
|
43
44
|
acc << ELLIPSIS
|
@@ -46,7 +47,6 @@ module TTY
|
|
46
47
|
bytesize += str.bytesize
|
47
48
|
acc << str
|
48
49
|
end
|
49
|
-
acc
|
50
50
|
end
|
51
51
|
line.join(SPACE)
|
52
52
|
end
|
@@ -86,8 +86,8 @@ module TTY
|
|
86
86
|
return LBRACE + ELLIPSIS + RBRACE if depth.zero?
|
87
87
|
|
88
88
|
LBRACE +
|
89
|
-
obj.map { |k, v| "#{dump_key(k)}=#{dump_val(v, depth)}" }
|
90
|
-
|
89
|
+
obj.map { |k, v| "#{dump_key(k)}=#{dump_val(v, depth)}" }
|
90
|
+
.join(SPACE) + RBRACE
|
91
91
|
end
|
92
92
|
|
93
93
|
def enc_arr(array, depth)
|
@@ -113,7 +113,8 @@ module TTY
|
|
113
113
|
case str
|
114
114
|
when SINGLE_QUOTE_REGEX
|
115
115
|
str.inspect
|
116
|
-
when ESCAPE_STR_REGEX, LITERAL_TRUE, LITERAL_FALSE,
|
116
|
+
when ESCAPE_STR_REGEX, LITERAL_TRUE, LITERAL_FALSE,
|
117
|
+
LITERAL_NIL, NUM_REGEX
|
117
118
|
ESCAPE_DOUBLE_QUOTE + str.inspect[1..-2] + ESCAPE_DOUBLE_QUOTE
|
118
119
|
else
|
119
120
|
str
|
@@ -55,7 +55,7 @@ module TTY
|
|
55
55
|
color: :cyan,
|
56
56
|
levelpad: 0
|
57
57
|
}
|
58
|
-
}
|
58
|
+
}.freeze
|
59
59
|
|
60
60
|
TEXT_REGEXP = /([{}()\[\]])?(["']?)(\S+?)(["']?=)/.freeze
|
61
61
|
JSON_REGEXP = /\"([^,]+?)\"(?=:)/.freeze
|
@@ -65,14 +65,24 @@ module TTY
|
|
65
65
|
json: [JSON_REGEXP, ->(c) { "\"" + c.("\\1") + "\"" }]
|
66
66
|
}.freeze
|
67
67
|
|
68
|
+
# The output stream
|
69
|
+
# @api private
|
68
70
|
attr_reader :output
|
69
71
|
|
72
|
+
# The configuration options
|
73
|
+
# @api private
|
70
74
|
attr_reader :config
|
71
75
|
|
76
|
+
# The logging level
|
77
|
+
# @api private
|
72
78
|
attr_reader :level
|
73
79
|
|
80
|
+
# The format for the message
|
81
|
+
# @api private
|
82
|
+
attr_reader :message_format
|
83
|
+
|
74
84
|
def initialize(output: $stderr, formatter: nil, config: nil, level: nil,
|
75
|
-
styles: {})
|
85
|
+
styles: {}, message_format: "%-25s")
|
76
86
|
@output = Array[output].flatten
|
77
87
|
@formatter = coerce_formatter(formatter || config.formatter).new
|
78
88
|
@formatter_name = @formatter.class.name.split("::").last.downcase
|
@@ -82,6 +92,7 @@ module TTY
|
|
82
92
|
@level = level || @config.level
|
83
93
|
@mutex = Mutex.new
|
84
94
|
@pastel = Pastel.new
|
95
|
+
@message_format = message_format
|
85
96
|
end
|
86
97
|
|
87
98
|
# Handle log event output in format
|
@@ -118,7 +129,7 @@ module TTY
|
|
118
129
|
fmt << color.(style[:symbol])
|
119
130
|
fmt << color.(style[:label]) + (" " * style[:levelpad])
|
120
131
|
end
|
121
|
-
fmt <<
|
132
|
+
fmt << message_format % event.message.join(" ")
|
122
133
|
unless event.fields.empty?
|
123
134
|
pattern, replacement = *@color_pattern
|
124
135
|
fmt << @formatter.dump(event.fields, max_bytes: config.max_bytes,
|
@@ -150,11 +161,11 @@ module TTY
|
|
150
161
|
#
|
151
162
|
# @api private
|
152
163
|
def configure_styles(event)
|
153
|
-
return {}
|
164
|
+
return {} if event.metadata[:name].nil?
|
154
165
|
|
155
166
|
STYLES.fetch(event.metadata[:name].to_sym, {})
|
156
|
-
|
157
|
-
|
167
|
+
.dup
|
168
|
+
.merge!(@styles[event.metadata[:name].to_sym] || {})
|
158
169
|
end
|
159
170
|
|
160
171
|
def configure_color(style)
|
data/lib/tty/logger/levels.rb
CHANGED
@@ -15,7 +15,7 @@ module TTY
|
|
15
15
|
warn: WARN_LEVEL,
|
16
16
|
error: ERROR_LEVEL,
|
17
17
|
fatal: FATAL_LEVEL
|
18
|
-
}
|
18
|
+
}.freeze
|
19
19
|
|
20
20
|
# All the default level names
|
21
21
|
#
|
@@ -60,6 +60,7 @@ module TTY
|
|
60
60
|
right = right.is_a?(Integer) ? right : level_to_number(right)
|
61
61
|
|
62
62
|
return :eq if left == right
|
63
|
+
|
63
64
|
left < right ? :lt : :gt
|
64
65
|
end
|
65
66
|
end # Levels
|
data/lib/tty/logger/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pastel
|