ougai 0.3.0 → 0.7.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/Gemfile +4 -0
- data/README.md +26 -3
- data/lib/ougai.rb +5 -120
- data/lib/ougai/formatters/base.rb +34 -0
- data/lib/ougai/formatters/bunyan.rb +34 -0
- data/lib/ougai/formatters/readable.rb +53 -0
- data/lib/ougai/logger.rb +81 -0
- data/lib/ougai/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db633bee49261c5ccbd935510e55a44128dc751c
|
4
|
+
data.tar.gz: 4525a5d1f6785e7a92240928eb986a17c7a1c06f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c9635f9cca06b4324cf0796a62069d26f37dcba4dd00f81e897b9d1bb6d8af710221993bafbbda1cb4119ed2df977cc8bafe475c7951a207d7893b0a6cdb5a5
|
7
|
+
data.tar.gz: c4dd71d91605a37dcbe28c64f1086a5db346d642e2acbc23ec31d1bf07724bf016eab4a3d792f72ca6f709402ba871ce29afb6e9df7b2a0d7fa0890840370d0b
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
Ougai
|
2
2
|
=====
|
3
3
|
|
4
|
-
[](https://travis-ci.org/tilfin/ougai)
|
5
4
|
[](https://badge.fury.io/rb/ougai)
|
5
|
+
[](https://travis-ci.org/tilfin/ougai)
|
6
6
|
|
7
|
-
A JSON logger is
|
7
|
+
A JSON logger is capable of handling a message, data or an exception easily.
|
8
|
+
It is compatible with [bunyan](https://github.com/trentm/node-bunyan) for Node.js.
|
9
|
+
It can also output human readable format for the console.
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
|
@@ -143,7 +145,7 @@ end
|
|
143
145
|
```
|
144
146
|
|
145
147
|
|
146
|
-
|
148
|
+
### View log by node-bunyan
|
147
149
|
|
148
150
|
Install [bunyan](https://github.com/trentm/node-bunyan) via NPM
|
149
151
|
|
@@ -169,6 +171,27 @@ $ bunyan output.log
|
|
169
171
|
main.rb:18:in `<main>'
|
170
172
|
```
|
171
173
|
|
174
|
+
## Use human Readable formatter for console
|
175
|
+
|
176
|
+
Add awesome_print to Gemfile and `bundle`
|
177
|
+
|
178
|
+
```ruby
|
179
|
+
gem 'awesome_print'
|
180
|
+
```
|
181
|
+
|
182
|
+
Set *Ougai::Formatters::Readable* instance to `formatter` accessor
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
require 'rubygems'
|
186
|
+
require 'ougai'
|
187
|
+
|
188
|
+
logger = Ougai::Logger.new(STDOUT)
|
189
|
+
logger.formatter = Ougai::Formatters::Readable.new
|
190
|
+
```
|
191
|
+
|
192
|
+
### Screen result example
|
193
|
+
|
194
|
+
)
|
172
195
|
|
173
196
|
## License
|
174
197
|
|
data/lib/ougai.rb
CHANGED
@@ -1,120 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
|
7
|
-
module Ougai
|
8
|
-
class Logger < Logger
|
9
|
-
attr_accessor :default_message, :app_name
|
10
|
-
attr_accessor :ex_key, :ex_trace_indent
|
11
|
-
|
12
|
-
def initialize(*args)
|
13
|
-
super(*args)
|
14
|
-
@default_message = 'No message'
|
15
|
-
@app_name = File.basename($0, ".rb")
|
16
|
-
@hostname = Socket.gethostname
|
17
|
-
@ex_key = :err
|
18
|
-
@ex_trace_indent = 2
|
19
|
-
@formatter = create_formatter
|
20
|
-
end
|
21
|
-
|
22
|
-
def debug(message, ex = nil, data = nil)
|
23
|
-
super(to_item(message, ex, data))
|
24
|
-
end
|
25
|
-
|
26
|
-
def info(message, ex = nil, data = nil)
|
27
|
-
super(to_item(message, ex, data))
|
28
|
-
end
|
29
|
-
|
30
|
-
def warn(message, ex = nil, data = nil)
|
31
|
-
super(to_item(message, ex, data))
|
32
|
-
end
|
33
|
-
|
34
|
-
def error(message, ex = nil, data = nil)
|
35
|
-
super(to_item(message, ex, data))
|
36
|
-
end
|
37
|
-
|
38
|
-
def fatal(message, ex = nil, data = nil)
|
39
|
-
super(to_item(message, ex, data))
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
|
44
|
-
def create_formatter
|
45
|
-
proc do |severity, time, progname, data|
|
46
|
-
JSON.generate({
|
47
|
-
name: progname || @app_name,
|
48
|
-
hostname: @hostname,
|
49
|
-
pid: $$,
|
50
|
-
level: to_level(severity),
|
51
|
-
time: time.iso8601(3),
|
52
|
-
v: 0
|
53
|
-
}.merge(data)) + "\n"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def to_item(msg, ex, data)
|
60
|
-
item = {}
|
61
|
-
if ex.nil? # 1 arg
|
62
|
-
if msg.is_a?(Exception)
|
63
|
-
item[:msg] = msg.to_s
|
64
|
-
item[@ex_key] = serialize_ex(msg)
|
65
|
-
elsif msg.is_a?(Hash)
|
66
|
-
item[:msg] = @default_message unless msg.key?(:msg)
|
67
|
-
item.merge!(msg)
|
68
|
-
else
|
69
|
-
item[:msg] = msg.to_s
|
70
|
-
end
|
71
|
-
elsif data.nil? # 2 args
|
72
|
-
if ex.is_a?(Exception)
|
73
|
-
item[:msg] = msg.to_s
|
74
|
-
item[@ex_key] = serialize_ex(ex)
|
75
|
-
elsif ex.is_a?(Hash)
|
76
|
-
item.merge!(ex)
|
77
|
-
if msg.is_a?(Exception)
|
78
|
-
item[@ex_key] = serialize_ex(msg)
|
79
|
-
else
|
80
|
-
item[:msg] = msg.to_s
|
81
|
-
end
|
82
|
-
end
|
83
|
-
elsif msg # 3 args
|
84
|
-
item[@ex_key] = serialize_ex(ex) if ex.is_a?(Exception)
|
85
|
-
item.merge!(data) if data.is_a?(Hash)
|
86
|
-
item[:msg] = msg.to_s
|
87
|
-
else # No args
|
88
|
-
item[:msg] = @default_message
|
89
|
-
end
|
90
|
-
item
|
91
|
-
end
|
92
|
-
|
93
|
-
def serialize_ex(ex)
|
94
|
-
err = {
|
95
|
-
name: ex.class.name,
|
96
|
-
message: ex.to_s
|
97
|
-
}
|
98
|
-
if ex.backtrace
|
99
|
-
sp = "\n" + ' ' * @ex_trace_indent
|
100
|
-
err[:stack] = ex.backtrace.join(sp)
|
101
|
-
end
|
102
|
-
err
|
103
|
-
end
|
104
|
-
|
105
|
-
def to_level(severity)
|
106
|
-
case severity
|
107
|
-
when 'INFO'
|
108
|
-
30
|
109
|
-
when 'WARN'
|
110
|
-
40
|
111
|
-
when 'ERROR'
|
112
|
-
50
|
113
|
-
when 'FATAL'
|
114
|
-
60
|
115
|
-
else # DEBUG
|
116
|
-
20
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
1
|
+
require 'ougai/version'
|
2
|
+
require 'ougai/formatters/base'
|
3
|
+
require 'ougai/formatters/bunyan'
|
4
|
+
require 'ougai/formatters/readable'
|
5
|
+
require 'ougai/logger'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'time'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
module Ougai
|
6
|
+
module Formatters
|
7
|
+
class Base < Logger::Formatter
|
8
|
+
attr_accessor :trace_indent, :trace_max_lines
|
9
|
+
|
10
|
+
def initialize(app_name = nil, hostname = nil)
|
11
|
+
@app_name = app_name || File.basename($0, ".rb")
|
12
|
+
@hostname = hostname || Socket.gethostname
|
13
|
+
@trace_indent = 2
|
14
|
+
@trace_max_lines = 100
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize_exc(ex)
|
18
|
+
err = {
|
19
|
+
name: ex.class.name,
|
20
|
+
message: ex.to_s
|
21
|
+
}
|
22
|
+
if ex.backtrace
|
23
|
+
err[:stack] = serialize_trace(ex.backtrace)
|
24
|
+
end
|
25
|
+
err
|
26
|
+
end
|
27
|
+
|
28
|
+
def serialize_trace(trace)
|
29
|
+
sp = "\n" + ' ' * @trace_indent
|
30
|
+
trace.slice(0, @trace_max_lines).join(sp)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'ougai/formatters/base'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Ougai
|
5
|
+
module Formatters
|
6
|
+
class Bunyan < Base
|
7
|
+
def call(severity, time, progname, data)
|
8
|
+
JSON.generate({
|
9
|
+
name: progname || @app_name,
|
10
|
+
hostname: @hostname,
|
11
|
+
pid: $$,
|
12
|
+
level: to_level(severity),
|
13
|
+
time: time.iso8601(3),
|
14
|
+
v: 0
|
15
|
+
}.merge(data)) + "\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_level(severity)
|
19
|
+
case severity
|
20
|
+
when 'INFO'
|
21
|
+
30
|
22
|
+
when 'WARN'
|
23
|
+
40
|
24
|
+
when 'ERROR'
|
25
|
+
50
|
26
|
+
when 'FATAL'
|
27
|
+
60
|
28
|
+
else # DEBUG
|
29
|
+
20
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'ougai/formatters/base'
|
2
|
+
|
3
|
+
module Ougai
|
4
|
+
module Formatters
|
5
|
+
class Readable < Base
|
6
|
+
def initialize(app_name = nil, hostname = nil)
|
7
|
+
super(app_name, hostname)
|
8
|
+
@trace_indent = 4
|
9
|
+
load_dependency
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(severity, time, progname, data)
|
13
|
+
msg = data.delete(:msg)
|
14
|
+
strs = ["[#{time.iso8601(3)}] #{colored_level(severity)}: #{msg}"]
|
15
|
+
if data.key?(:err)
|
16
|
+
err = data.delete(:err)
|
17
|
+
err_str = " #{err[:name]} (#{err[:message]}):"
|
18
|
+
err_str += "\n " + err[:stack] if err.key?(:stack)
|
19
|
+
strs.push(err_str)
|
20
|
+
end
|
21
|
+
unless data.empty?
|
22
|
+
strs.push(data.ai)
|
23
|
+
end
|
24
|
+
strs.join("\n") + "\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def colored_level(severity)
|
28
|
+
case severity
|
29
|
+
when 'INFO'
|
30
|
+
color = '0;36'
|
31
|
+
when 'WARN'
|
32
|
+
color = '0;33'
|
33
|
+
when 'ERROR'
|
34
|
+
color = '0;31'
|
35
|
+
when 'FATAL'
|
36
|
+
color = '0;35'
|
37
|
+
else # DEBUG
|
38
|
+
color = '0;37'
|
39
|
+
end
|
40
|
+
"\e[#{color}m#{severity}\e[0m"
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def load_dependency
|
46
|
+
require 'awesome_print'
|
47
|
+
rescue LoadError
|
48
|
+
puts 'You must install the awesome_print gem to use this output.'
|
49
|
+
raise
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/ougai/logger.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'ougai/formatters/bunyan'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
module Ougai
|
5
|
+
class Logger < ::Logger
|
6
|
+
attr_accessor :default_message, :exc_key
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
super(*args)
|
10
|
+
@default_message = 'No message'
|
11
|
+
@exc_key = :err
|
12
|
+
@formatter = create_formatter
|
13
|
+
end
|
14
|
+
|
15
|
+
def debug(message, ex = nil, data = nil)
|
16
|
+
super(to_item(message, ex, data))
|
17
|
+
end
|
18
|
+
|
19
|
+
def info(message, ex = nil, data = nil)
|
20
|
+
super(to_item(message, ex, data))
|
21
|
+
end
|
22
|
+
|
23
|
+
def warn(message, ex = nil, data = nil)
|
24
|
+
super(to_item(message, ex, data))
|
25
|
+
end
|
26
|
+
|
27
|
+
def error(message, ex = nil, data = nil)
|
28
|
+
super(to_item(message, ex, data))
|
29
|
+
end
|
30
|
+
|
31
|
+
def fatal(message, ex = nil, data = nil)
|
32
|
+
super(to_item(message, ex, data))
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def create_formatter
|
38
|
+
Formatters::Bunyan.new
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def to_item(msg, ex, data)
|
44
|
+
item = {}
|
45
|
+
if ex.nil? # 1 arg
|
46
|
+
if msg.is_a?(Exception)
|
47
|
+
item[:msg] = msg.to_s
|
48
|
+
set_exc(item, msg)
|
49
|
+
elsif msg.is_a?(Hash)
|
50
|
+
item[:msg] = @default_message unless msg.key?(:msg)
|
51
|
+
item.merge!(msg)
|
52
|
+
else
|
53
|
+
item[:msg] = msg.to_s
|
54
|
+
end
|
55
|
+
elsif data.nil? # 2 args
|
56
|
+
if ex.is_a?(Exception)
|
57
|
+
item[:msg] = msg.to_s
|
58
|
+
set_exc(item, ex)
|
59
|
+
elsif ex.is_a?(Hash)
|
60
|
+
item.merge!(ex)
|
61
|
+
if msg.is_a?(Exception)
|
62
|
+
set_exc(item, msg)
|
63
|
+
else
|
64
|
+
item[:msg] = msg.to_s
|
65
|
+
end
|
66
|
+
end
|
67
|
+
elsif msg # 3 args
|
68
|
+
set_exc(item, ex) if ex.is_a?(Exception)
|
69
|
+
item.merge!(data) if data.is_a?(Hash)
|
70
|
+
item[:msg] = msg.to_s
|
71
|
+
else # No args
|
72
|
+
item[:msg] = @default_message
|
73
|
+
end
|
74
|
+
item
|
75
|
+
end
|
76
|
+
|
77
|
+
def set_exc(item, exc)
|
78
|
+
item[@exc_key] = @formatter.serialize_exc(exc)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/ougai/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ougai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toshimitsu Takahashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -67,6 +67,10 @@ files:
|
|
67
67
|
- README.md
|
68
68
|
- Rakefile
|
69
69
|
- lib/ougai.rb
|
70
|
+
- lib/ougai/formatters/base.rb
|
71
|
+
- lib/ougai/formatters/bunyan.rb
|
72
|
+
- lib/ougai/formatters/readable.rb
|
73
|
+
- lib/ougai/logger.rb
|
70
74
|
- lib/ougai/version.rb
|
71
75
|
- ougai.gemspec
|
72
76
|
homepage: https://github.com/tilfin/ougai
|