slog 1.0.0 → 1.1.0
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/README.md +72 -25
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/slog/logger.rb +50 -28
- data/lib/slog/metadata.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d3de78de50b7caaa19ac71dd29c9a7b5acfc3a5
|
4
|
+
data.tar.gz: 0a2ba828d3563e997df44394cee048b1d9ef6638
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fda260806e74c4109edd77f0bdebf6b9e236427e0387300fd83eba5828ce396eb2d58340451b42497d70a037769612fc7b02ceb1ab43faed098c2e4d28b46d06
|
7
|
+
data.tar.gz: 76ddc56ef3243f5e3a800f1f47a167a65af6d456f491cceae4e7705fffad2668394a96cbf5da3a2a6fb7e69e9e9e340deb5514ee4943e2a62dd3a0b8ceff2415
|
data/README.md
CHANGED
@@ -1,38 +1,85 @@
|
|
1
1
|
# Slog
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
Add `slog` to your application's Gemspec or Gemfile.
|
8
|
-
|
9
|
-
## Usage
|
3
|
+
Easy structured logging.
|
10
4
|
|
11
5
|
`Slog::Logger` extends the base `Logger` with JSON serialization, colorization,
|
12
|
-
|
6
|
+
and a new `TRACE` level. Output is suitable for collection by Logstash or Franz.
|
13
7
|
|
14
8
|
```ruby
|
15
9
|
require 'slog'
|
16
10
|
|
17
|
-
# First, these two are equivalent
|
18
|
-
logger_one = Slog::Logger.new
|
19
|
-
logger_two = Slog.new
|
20
11
|
|
21
|
-
#
|
22
|
-
Slog.new
|
12
|
+
# Full initializer
|
13
|
+
Slog::Logger.new \
|
14
|
+
out: $stdout, # Set the log output handle
|
15
|
+
shift_age: 7, # Number of log files to keep
|
16
|
+
shift_size: 1_048_576, # Maximum size of log files (in bytes)
|
17
|
+
colorize: true, # Toggle colorized output
|
18
|
+
prettify: true, # Toggle pretty JSON output
|
19
|
+
level: :info, # Set log level (Logger constant or Symbol)
|
20
|
+
level_transform: 'downcase', # Transform the log level (String methods)
|
21
|
+
level_field: 'level', # Set level field name (nil to disable)
|
22
|
+
message_field: 'message', # Set message field name (nil to disable)
|
23
|
+
timestamp_field: '@timestamp', # Set timestamp field name (nil to disable)
|
24
|
+
timestamp_format: '%FT%T.%3N%:z', # Set timestamp format (Time#strftime)
|
25
|
+
# Map each log level to fore- and background colors
|
26
|
+
# Colors provided by the fantastic "colorize" gem
|
27
|
+
color_map: { 'debug' => [ :blue, :default ],
|
28
|
+
'info' => [ :green, :default ],
|
29
|
+
'warn' => [ :yellow, :default ],
|
30
|
+
'error' => [ :red, :default ],
|
31
|
+
'fatal' => [ :red, :black ],
|
32
|
+
'trace' => [ :magenta, :default ] }
|
33
|
+
|
34
|
+
|
35
|
+
# These two are equivalent
|
36
|
+
Slog::Logger.new
|
37
|
+
Slog.new
|
38
|
+
|
39
|
+
|
40
|
+
# By default, output is pretty and colored (I swear)
|
41
|
+
Slog.new.info 'example'
|
42
|
+
#
|
43
|
+
# {
|
44
|
+
# "level": "info",
|
45
|
+
# "@timestamp": "2014-12-25T06:22:43.459-08:00",
|
46
|
+
# "message": "example"
|
47
|
+
# }
|
48
|
+
#
|
49
|
+
|
50
|
+
|
51
|
+
# When logging to file, you prolly want to disable that
|
52
|
+
Slog.new(out: 'test.log', colorize: false, prettify: false).info 'example'
|
53
|
+
#
|
54
|
+
# {"level":"info","@timestamp":"2014-12-25T06:25:54.793-08:00","message":"example"}
|
55
|
+
#
|
56
|
+
|
23
57
|
|
24
|
-
#
|
25
|
-
|
58
|
+
# You'll no doubt have noticed you passed a String into the Logger, but a Hash
|
59
|
+
# came out the other end. That's "structured" logging. The String turned into
|
60
|
+
# the "message" field, and "level" and "@timestamp" fields were added. All
|
61
|
+
# that's totally configurable:
|
62
|
+
Slog.new({
|
63
|
+
message_field: nil,
|
64
|
+
timestamp_field: 'date',
|
65
|
+
timestamp_format: '%Y.%m.%d'
|
66
|
+
}).info 'example'
|
67
|
+
#
|
68
|
+
# {
|
69
|
+
# "level": "info",
|
70
|
+
# "date": "2014.12.25"
|
71
|
+
# }
|
72
|
+
#
|
26
73
|
|
27
|
-
# When logging to file, you may want to disable colors and pretty output
|
28
|
-
Slog.new out: 'test.log', colorization: false, pretty: false
|
29
74
|
|
30
|
-
#
|
31
|
-
Slog.new
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
75
|
+
# You can write structured logs by passing a Hash
|
76
|
+
Slog.new({
|
77
|
+
level_field: nil,
|
78
|
+
}).info event: 'example', level: 'MINE', '@timestamp' => nil
|
79
|
+
#
|
80
|
+
# {
|
81
|
+
# "event": "example",
|
82
|
+
# "level": "MINE"
|
83
|
+
# }
|
84
|
+
#
|
38
85
|
```
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/lib/slog/logger.rb
CHANGED
@@ -5,7 +5,7 @@ require 'json'
|
|
5
5
|
require 'colorize'
|
6
6
|
|
7
7
|
|
8
|
-
# Extending the base Logger
|
8
|
+
# Extending the base Logger with TRACE capabilities.
|
9
9
|
class Logger
|
10
10
|
|
11
11
|
# Adding the new severity level
|
@@ -14,7 +14,7 @@ class Logger
|
|
14
14
|
# So we can reference it by name
|
15
15
|
TRACE = SEV_LABEL.index('TRACE')
|
16
16
|
|
17
|
-
# Send a TRACE-level log
|
17
|
+
# Send a TRACE-level log
|
18
18
|
def trace progname, &block
|
19
19
|
return true unless @trace
|
20
20
|
add TRACE, nil, progname, &block
|
@@ -26,30 +26,48 @@ end
|
|
26
26
|
|
27
27
|
module Slog
|
28
28
|
|
29
|
-
# A colorful
|
29
|
+
# A colorful structured logger.
|
30
30
|
class Logger < Logger
|
31
31
|
|
32
32
|
DEFAULT_LEVEL = ::Logger::INFO
|
33
33
|
|
34
|
-
# Maps each log level to a unique combination of fore- and background colors
|
35
|
-
SEVERITY_COLORS = {
|
36
|
-
'debug' => [ :blue, :default ],
|
37
|
-
'info' => [ :green, :default ],
|
38
|
-
'warn' => [ :yellow, :default ],
|
39
|
-
'error' => [ :red, :default ],
|
40
|
-
'fatal' => [ :red, :black ],
|
41
|
-
'trace' => [ :magenta, :default ]
|
42
|
-
}
|
43
|
-
|
44
|
-
|
45
34
|
# Create a new Logger.
|
46
35
|
#
|
47
36
|
# A little different than the canonical Logger. Add options to set the
|
48
|
-
# log level and
|
49
|
-
|
50
|
-
|
37
|
+
# log level and to disable both colorization and pretty JSON output. In
|
38
|
+
# this form, it's perfect for use with either Logstash or Franz.
|
39
|
+
def initialize \
|
40
|
+
out:$stdout, # Output handle
|
41
|
+
shift_age:7, # Max seven logs
|
42
|
+
shift_size:1_048_576, # 1024 KiB
|
43
|
+
colorize:true, # Disable for files
|
44
|
+
prettify:true, # Disable for files
|
45
|
+
level:DEFAULT_LEVEL, # INFO
|
46
|
+
level_transform:'downcase', # Any String method
|
47
|
+
level_field:'level', # nil to disable
|
48
|
+
message_field: 'message', # nil to disable
|
49
|
+
timestamp_field:'@timestamp', # nil to disable
|
50
|
+
timestamp_format:'%FT%T.%3N%:z', # ISO-8601
|
51
|
+
color_map: {
|
52
|
+
'debug' => [ :blue, :default ],
|
53
|
+
'info' => [ :green, :default ],
|
54
|
+
'warn' => [ :yellow, :default ],
|
55
|
+
'error' => [ :red, :default ],
|
56
|
+
'fatal' => [ :red, :black ],
|
57
|
+
'trace' => [ :magenta, :default ]
|
58
|
+
}
|
59
|
+
|
60
|
+
@prettify = prettify
|
61
|
+
@colorize = colorize
|
62
|
+
@color_map = color_map
|
63
|
+
@level_field = level_field
|
64
|
+
@level_transform = level_transform
|
65
|
+
@timestamp_field = timestamp_field
|
66
|
+
@timestamp_format = timestamp_format
|
67
|
+
|
51
68
|
super out, shift_age, shift_size
|
52
69
|
self.level = level
|
70
|
+
|
53
71
|
set_formatter
|
54
72
|
end
|
55
73
|
|
@@ -57,7 +75,7 @@ module Slog
|
|
57
75
|
# Set the formatter to work our magic
|
58
76
|
def set_formatter
|
59
77
|
self.formatter = proc do |severity, datetime, _, message|
|
60
|
-
severity.downcase!
|
78
|
+
severity.downcase!
|
61
79
|
|
62
80
|
# If it ain't a structured log, it is now.
|
63
81
|
event = structure_event severity, datetime, message
|
@@ -67,7 +85,7 @@ module Slog
|
|
67
85
|
event.merge! marker: File.basename(caller[4])
|
68
86
|
end
|
69
87
|
|
70
|
-
#
|
88
|
+
# Apply colorization and prettification as required
|
71
89
|
format_json event, severity
|
72
90
|
end
|
73
91
|
end
|
@@ -75,29 +93,33 @@ module Slog
|
|
75
93
|
|
76
94
|
# Turn a call to the formatter into a Hash structure
|
77
95
|
def structure_event severity, datetime, message
|
78
|
-
message = {
|
79
|
-
|
80
|
-
|
81
|
-
|
96
|
+
message = { @message_field => message } unless message.is_a? Hash
|
97
|
+
event = {
|
98
|
+
@level_field => severity.send(@level_transform),
|
99
|
+
@timestamp_field => datetime.strftime(@timestamp_format)
|
100
|
+
}
|
101
|
+
event.merge message
|
102
|
+
event.delete nil # ignore @field if @field.nil?
|
103
|
+
event
|
82
104
|
end
|
83
105
|
|
84
106
|
|
85
107
|
# Convert the structured event into it's JSON representation
|
86
108
|
def format_json event, severity
|
87
|
-
generator = @
|
109
|
+
generator = @prettify ? :pretty_generate : :generate
|
88
110
|
event = JSON.send(generator, event) + "\n"
|
89
111
|
return event unless @colorize
|
90
112
|
event.colorize \
|
91
|
-
|
92
|
-
|
113
|
+
color: @color_map[severity][0],
|
114
|
+
background: @color_map[severity][1]
|
93
115
|
end
|
94
116
|
|
95
117
|
|
96
118
|
# Override the level setter to allow symbols and TRACE
|
97
119
|
def level= l
|
98
120
|
l = ::Logger.const_get l.upcase if l.is_a? Symbol
|
99
|
-
@trace = l == ::Logger::TRACE
|
100
|
-
l = ::Logger::DEBUG if @trace
|
121
|
+
@trace = l == ::Logger::TRACE # TRACE is really a fancy DEBUG
|
122
|
+
l = ::Logger::DEBUG if @trace # Here's the proof.
|
101
123
|
super l
|
102
124
|
end
|
103
125
|
|
data/lib/slog/metadata.rb
CHANGED
@@ -8,7 +8,7 @@ module Slog
|
|
8
8
|
VERSION = File.read(File.join(ROOT, 'VERSION')).strip
|
9
9
|
|
10
10
|
# We don't really do all that much, be humble
|
11
|
-
SUMMARY = '
|
11
|
+
SUMMARY = 'Easy structured logging'
|
12
12
|
|
13
13
|
# Your benevolent dictator for life
|
14
14
|
AUTHOR = 'Sean Clemmer'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Clemmer
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
27
|
+
description: Easy structured logging.
|
28
28
|
email: sczizzo@gmail.com
|
29
29
|
executables: []
|
30
30
|
extensions: []
|
@@ -66,7 +66,7 @@ rubyforge_project:
|
|
66
66
|
rubygems_version: 2.2.2
|
67
67
|
signing_key:
|
68
68
|
specification_version: 4
|
69
|
-
summary:
|
69
|
+
summary: Easy structured logging
|
70
70
|
test_files:
|
71
71
|
- test/test_helper.rb
|
72
72
|
- test/test_slog.rb
|