shog 0.0.1pre → 0.0.2
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/lib/shog.rb +6 -0
- data/lib/shog/formatter.rb +149 -0
- data/lib/shog/formatters.rb +2 -0
- data/lib/shog/formatters/defaults.rb +20 -0
- data/lib/shog/formatters/requests.rb +48 -0
- data/lib/shog/rails.rb +14 -0
- data/lib/shog/version.rb +2 -2
- data/shog.gemspec +1 -0
- data/spec/lib/shog/formatter_spec.rb +67 -0
- metadata +24 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e02b8810b0926489472a9c3ae7172681c903d247
|
4
|
+
data.tar.gz: 82e7c9c7d3fbc7ea093b79f3afd0c638c9bab046
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a851ea89f9357838dd1d6b2f31108757b1b846cdcfec47004887a08cf825c4afd086217251c49e403f2589f1697b15d5d1094043e715ba821c2e70258bf25c1
|
7
|
+
data.tar.gz: 515b080f51d3f66fa3d49f48c1a9e6fbc26916c46e27261195c38eb3aa244a384981b229ef3584e8f45314a198be31842cd0a4907b55f35c2f291fae4fe384e6
|
data/lib/shog.rb
CHANGED
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'active_support/tagged_logging'
|
2
|
+
require 'colored'
|
3
|
+
|
4
|
+
module Shog
|
5
|
+
class Formatter < ::ActiveSupport::Logger::SimpleFormatter
|
6
|
+
|
7
|
+
include ActiveSupport::TaggedLogging::Formatter
|
8
|
+
|
9
|
+
def call( severity, time, progname, msg )
|
10
|
+
return if msg.blank?
|
11
|
+
tagged formatted_severity_tag( severity ) do
|
12
|
+
msg = formatted_message( severity, msg )
|
13
|
+
msg = timestamped_message( time, msg )
|
14
|
+
msg = prognamed_message( progname, msg )
|
15
|
+
|
16
|
+
super severity, time, progname, msg
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
reset_config!
|
22
|
+
end
|
23
|
+
|
24
|
+
# Formats the message according to the configured settings.
|
25
|
+
# @param [String] msg to format.
|
26
|
+
def formatted_message( severity, msg )
|
27
|
+
msg = String === msg ? msg : msg.inspect
|
28
|
+
|
29
|
+
if args = matched( msg )
|
30
|
+
args.first.call msg, args.last
|
31
|
+
elsif proc = configuration[:severities][severity]
|
32
|
+
proc.call msg
|
33
|
+
else
|
34
|
+
msg
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Formats the severity indicator prefixed before each line when writing to
|
39
|
+
# the log.
|
40
|
+
# @param [String] the severity of the message (ex DEBUG, WARN, etc.)
|
41
|
+
# @return [String] formatted version of the severity
|
42
|
+
def formatted_severity_tag( severity )
|
43
|
+
length = configuration[:severity_tags][:_length] ||= begin
|
44
|
+
configuration[:severity_tags].reduce(0){ |l,(k,_)| [k.length,l].max }
|
45
|
+
end
|
46
|
+
|
47
|
+
padded_severity = severity.ljust length
|
48
|
+
|
49
|
+
if proc = configuration[:severity_tags][severity]
|
50
|
+
proc.call padded_severity
|
51
|
+
else
|
52
|
+
padded_severity
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Formats a ms time value.
|
57
|
+
def format_time( time, expected = 30 )
|
58
|
+
timef = time.to_f
|
59
|
+
case
|
60
|
+
when timef > expected * 2 then time.to_s.red
|
61
|
+
when timef > expected then time.to_s.yellow
|
62
|
+
else time
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
# ==========================================================================
|
68
|
+
# @!group Configuration
|
69
|
+
|
70
|
+
# Configure messages formatting for this formatter.
|
71
|
+
def configure( &block )
|
72
|
+
instance_eval( &block )
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
# Format the severity tagged before each line.
|
77
|
+
def severity_tag( level, &block )
|
78
|
+
configuration[:severity_tags][ level.to_s.upcase ] = block
|
79
|
+
end
|
80
|
+
|
81
|
+
# Provide customized formatting for messages of the given severity when they
|
82
|
+
# a custom matcher cannot be found.
|
83
|
+
# @param [String,Symbol] level to format.
|
84
|
+
def severity( level, &block )
|
85
|
+
configuration[:severities][ level.to_s.upcase ] = block
|
86
|
+
end
|
87
|
+
|
88
|
+
# Resets any previously configured formatting settings.
|
89
|
+
def reset_config!
|
90
|
+
@configuration ||= {
|
91
|
+
severity_tags: {},
|
92
|
+
severities: {},
|
93
|
+
matchers: {}
|
94
|
+
}
|
95
|
+
self
|
96
|
+
end
|
97
|
+
|
98
|
+
# When a log message matches the given pattern, provide a custom format
|
99
|
+
# for it.
|
100
|
+
def match( pattern, &block )
|
101
|
+
configuration[:matchers][pattern] = block
|
102
|
+
end
|
103
|
+
|
104
|
+
# Adds the named matchers to the log
|
105
|
+
def formatter( mod )
|
106
|
+
unless mod.is_a? Module
|
107
|
+
mod = "Shog::Formatters::#{mod.to_s.camelize}".constantize
|
108
|
+
end
|
109
|
+
|
110
|
+
mod.configure self
|
111
|
+
end
|
112
|
+
|
113
|
+
# Include timestamp in logged messages.
|
114
|
+
def timestamp( enabled = true )
|
115
|
+
configuration[:timestamp] = enabled
|
116
|
+
end
|
117
|
+
|
118
|
+
# Include the progname in logged messages.
|
119
|
+
def progname( enabled = true )
|
120
|
+
configuration[:progname] = enabled
|
121
|
+
end
|
122
|
+
|
123
|
+
# @!endgroup
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
attr_accessor :configuration
|
128
|
+
|
129
|
+
def matched( msg )
|
130
|
+
if matched = configuration[:matchers].find do |pattern,_|
|
131
|
+
pattern === msg
|
132
|
+
end
|
133
|
+
[matched.last, Regexp.last_match]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def timestamped_message( time, msg )
|
138
|
+
return msg unless configuration[:timestamp]
|
139
|
+
|
140
|
+
"[#{time}] #{msg}"
|
141
|
+
end
|
142
|
+
|
143
|
+
def prognamed_message( progname, msg )
|
144
|
+
return msg unless configuration[:progname]
|
145
|
+
|
146
|
+
"[#{progname}] #{msg}"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Shog
|
2
|
+
module Formatters
|
3
|
+
# Default formatting options
|
4
|
+
module Defaults
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def configure( formatter )
|
8
|
+
formatter.configure do
|
9
|
+
severity_tag( :debug ) { |msg| msg.black.bold }
|
10
|
+
severity_tag( :warn ) { |msg| msg.yellow }
|
11
|
+
severity_tag( :error ) { |msg| msg.red }
|
12
|
+
severity_tag( :fatal ) { |msg| msg.white_on_red }
|
13
|
+
|
14
|
+
severity( :error ){ |msg| msg.red }
|
15
|
+
severity( :fatal ){ |msg| msg.red }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Shog
|
2
|
+
module Formatters
|
3
|
+
# Format log messages from the request processing such as controller endpoints and views.
|
4
|
+
module Requests
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def configure( formatter )
|
8
|
+
formatter.configure do
|
9
|
+
match /Started\s+(?<method>PUT|PATCH|GET|POST|DELETE)\s+(?<path>"[^"]*")[^\d\.]+(?<ip>[\d\.]+)(?<time>.*)/ do |msg,match|
|
10
|
+
# http://refiddle.com/ge6
|
11
|
+
"#{match["method"].ljust 6} ".green.bold + " #{match["path"]} ".white.bold + " for " + "#{match["ip"]}".yellow + " #{match["time"]}".black.bold
|
12
|
+
end
|
13
|
+
|
14
|
+
match /\s*Rendered\s+(?<view>[^\s]+)\swithin\s(?<layout>[^\s]+)\s\((?<time>.*)\)/ do |msg,match|
|
15
|
+
# http://refiddle.com/18qr
|
16
|
+
" Rendered " + match["view"].white.bold + " within " + match["layout"].white + " " + format_time( match['time'] )
|
17
|
+
end
|
18
|
+
|
19
|
+
match /\s*Completed\s(?<code>\d+)\s(?<friendly>.*)\sin\s(?<time>\d+[^\s]*)\s(?<details>.*)/ do |msg,match|
|
20
|
+
# http://refiddle.com/18qq
|
21
|
+
parts = [ "Completed" ]
|
22
|
+
parts << case match['code'].to_i
|
23
|
+
when 200..399 then match['code'].green
|
24
|
+
when 400..499 then match['code'].yellow
|
25
|
+
else match['code'].red
|
26
|
+
end
|
27
|
+
parts << match['friendly'].yellow
|
28
|
+
parts << 'in'
|
29
|
+
parts << format_time( match['time'], 250 )
|
30
|
+
parts << match['details']
|
31
|
+
|
32
|
+
parts.join(" ")
|
33
|
+
end
|
34
|
+
|
35
|
+
match /Processing by (?<controller>[^\s]*) as (?<format>.*)/ do |msg,match|
|
36
|
+
# http://refiddle.com/18qs
|
37
|
+
"Processing by #{match['controller'].magenta.bold} as #{match['format'].yellow}"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/shog/rails.rb
ADDED
data/lib/shog/version.rb
CHANGED
data/shog.gemspec
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Shog::Formatters::Spec
|
4
|
+
module_function
|
5
|
+
def configure( formatter )
|
6
|
+
formatter.configure do
|
7
|
+
severity :test, ->{}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Shog::Formatter do
|
13
|
+
let(:formatter){ Shog::Formatter.new }
|
14
|
+
|
15
|
+
describe "#formatted_severity_tag" do
|
16
|
+
it "buffers to the same size" do
|
17
|
+
formatter.severity_tag( :warn ){ |msg| msg }
|
18
|
+
formatter.severity_tag( :longer ){ |msg| msg }
|
19
|
+
|
20
|
+
expect( formatter.formatted_severity_tag( "WARN" ) ).to eq "WARN "
|
21
|
+
expect( formatter.formatted_severity_tag( "LONGER" ) ).to eq "LONGER"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#match" do
|
26
|
+
it "formats a matched line" do
|
27
|
+
formatter.match /GET/ do |msg,match|
|
28
|
+
"R'DONE"
|
29
|
+
end
|
30
|
+
|
31
|
+
result = formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
|
32
|
+
expect( result ).to eq "[INFO] R'DONE\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "includes the match" do
|
36
|
+
formatter.match /GET/ do |msg,match|
|
37
|
+
expect( match ).to be_present
|
38
|
+
end
|
39
|
+
|
40
|
+
formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
|
41
|
+
end
|
42
|
+
|
43
|
+
it "doesn't match" do
|
44
|
+
result = formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
|
45
|
+
expect( result ).to eq "[INFO] Started GET \"/Home\"\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "uses default severity when no matcher is found" do
|
49
|
+
formatter.severity( :info ){ |msg| "DEFAULT" }
|
50
|
+
|
51
|
+
result = formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
|
52
|
+
expect( result ).to eq "[INFO] DEFAULT\n"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#formatters" do
|
57
|
+
it "loads from a symbol" do
|
58
|
+
formatter.should_receive(:severity).with(:test, anything())
|
59
|
+
|
60
|
+
formatter.configure do
|
61
|
+
formatter :spec
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Alexander
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colored
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,8 +101,14 @@ files:
|
|
87
101
|
- README.md
|
88
102
|
- Rakefile
|
89
103
|
- lib/shog.rb
|
104
|
+
- lib/shog/formatter.rb
|
105
|
+
- lib/shog/formatters.rb
|
106
|
+
- lib/shog/formatters/defaults.rb
|
107
|
+
- lib/shog/formatters/requests.rb
|
108
|
+
- lib/shog/rails.rb
|
90
109
|
- lib/shog/version.rb
|
91
110
|
- shog.gemspec
|
111
|
+
- spec/lib/shog/formatter_spec.rb
|
92
112
|
- spec/spec_helper.rb
|
93
113
|
homepage: https://github.com/phallguy/shog
|
94
114
|
licenses:
|
@@ -105,9 +125,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
125
|
version: 1.9.2
|
106
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
127
|
requirements:
|
108
|
-
- - "
|
128
|
+
- - ">="
|
109
129
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
130
|
+
version: '0'
|
111
131
|
requirements: []
|
112
132
|
rubyforge_project:
|
113
133
|
rubygems_version: 2.3.0
|
@@ -115,5 +135,6 @@ signing_key:
|
|
115
135
|
specification_version: 4
|
116
136
|
summary: Make rails 4.0 log details more colorful
|
117
137
|
test_files:
|
138
|
+
- spec/lib/shog/formatter_spec.rb
|
118
139
|
- spec/spec_helper.rb
|
119
140
|
has_rdoc:
|