lograge 0.0.3 → 0.0.4
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.
- data/README.md +46 -6
- data/lib/lograge.rb +22 -4
- data/lib/lograge/log_subscriber.rb +11 -2
- data/lib/lograge/version.rb +1 -1
- data/lograge.gemspec +1 -1
- data/spec/lograge_logsubscriber_spec.rb +23 -4
- metadata +11 -11
data/README.md
CHANGED
@@ -7,6 +7,10 @@ default logging output. Rails' default approach to log everything is great
|
|
7
7
|
during development, it's terrible when running it in production. It pretty much
|
8
8
|
renders Rails logs useless to me.
|
9
9
|
|
10
|
+
Lograge is a work in progress. I appreciate constructive feedback and criticism.
|
11
|
+
My main goal is to improve Rails' logging and to show people that they don't
|
12
|
+
need to stick with its defaults anymore if they don't want to.
|
13
|
+
|
10
14
|
Instead of trying solving the problem of having multiple lines per request by
|
11
15
|
switching Rails' logger for something that outputs syslog lines or adds a
|
12
16
|
request token, Lograge replaces Rails' request logging entirely, reducing the
|
@@ -51,7 +55,23 @@ Enable it for the relevant environments, e.g. production:
|
|
51
55
|
```
|
52
56
|
# config/environments/production.rb
|
53
57
|
MyApp::Application.configure do
|
54
|
-
config.lograge.enabled = true
|
58
|
+
config.lograge.enabled = true
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
You can also add a hook for own custom data
|
63
|
+
|
64
|
+
```
|
65
|
+
# config/environments/staging.rb
|
66
|
+
MyApp::Application.configure do
|
67
|
+
config.lograge.enabled = true
|
68
|
+
|
69
|
+
# custom_options can be a lambda or hash
|
70
|
+
# if it's a lambda then it must return a hash
|
71
|
+
config.lograge.custom_options = lambda do |event|
|
72
|
+
# capture some specific timing values you are interested in
|
73
|
+
{:name => "value", :name => "%2f" % float}
|
74
|
+
end
|
55
75
|
end
|
56
76
|
```
|
57
77
|
|
@@ -79,16 +99,24 @@ While the LogSubscribers encapsulate most logging pretty nicely, there are still
|
|
79
99
|
two lines that show up no matter what. The first line that's output for every
|
80
100
|
Rails request, you know, this one:
|
81
101
|
|
102
|
+
```
|
103
|
+
Started GET "/" for 127.0.0.1 at 2012-03-12 17:10:10 +0100
|
104
|
+
```
|
105
|
+
|
82
106
|
And the verbose output coming from rack-cache:
|
83
107
|
|
108
|
+
```
|
109
|
+
cache: [GET /] miss
|
110
|
+
```
|
111
|
+
|
84
112
|
Both are independent of the LogSubscribers, and both need to be shut up using
|
85
113
|
different means.
|
86
114
|
|
87
|
-
For the first one, the starting line of every Rails request log, Lograge
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
115
|
+
For the first one, the starting line of every Rails request log, Lograge
|
116
|
+
replaces code in `Rails::Rack::Logger` to remove that particular log line. It's
|
117
|
+
not great, but it's just another unnecessary output and would still clutter the
|
118
|
+
log files. Maybe a future version of Rails will make this log line an event as
|
119
|
+
well.
|
92
120
|
|
93
121
|
To remove rack-cache's output (which is only enabled if caching in Rails is
|
94
122
|
enabled), Lograge disables verbosity for rack-cache, which is unfortunately
|
@@ -98,6 +126,9 @@ There, a single line per request. Beautiful.
|
|
98
126
|
|
99
127
|
**What it doesn't do**
|
100
128
|
|
129
|
+
Lograge is opinionated, very opinionated. If the stuff below doesn't suit your
|
130
|
+
needs, it may not be for you.
|
131
|
+
|
101
132
|
Lograge removes ActionView logging, which also includes rendering times for
|
102
133
|
partials. If you're into those, Lograge is probably not for you. In my honest
|
103
134
|
opinion, those rendering times don't belong in the log file, they should be
|
@@ -106,6 +137,15 @@ service that allows graphing rendering percentiles. I assume this for everything
|
|
106
137
|
that represents a moving target. That kind of data is better off being
|
107
138
|
visualized in graphs than dumped (and ignored) in a log file.
|
108
139
|
|
140
|
+
Lograge doesn't yet log the request parameters. This is something I'm actively
|
141
|
+
contemplating, mainly because I want to find a good way to include them, a way
|
142
|
+
that fits in with the general spirit of the log output generated by Lograge.
|
143
|
+
|
144
|
+
**Changes**
|
145
|
+
|
146
|
+
* Add `custom_options` to allow adding custom key-value pairs at runtime (Adam
|
147
|
+
Cooper, https://github.com/adamcooper)
|
148
|
+
|
109
149
|
**License**
|
110
150
|
|
111
151
|
MIT. Code extracted from [Travis CI](http://travis-ci.org).
|
data/lib/lograge.rb
CHANGED
@@ -5,15 +5,32 @@ require 'active_support/core_ext/string/inflections'
|
|
5
5
|
require 'active_support/ordered_options'
|
6
6
|
|
7
7
|
module Lograge
|
8
|
-
mattr_accessor :logger
|
8
|
+
mattr_accessor :logger
|
9
|
+
|
10
|
+
# Custom options that will be appended to log line
|
11
|
+
#
|
12
|
+
# Currently supported formats are:
|
13
|
+
# - Hash
|
14
|
+
# - Any object that responds to call and returns a hash
|
15
|
+
#
|
16
|
+
mattr_writer :custom_options
|
17
|
+
self.custom_options = nil
|
18
|
+
|
19
|
+
def self.custom_options(event)
|
20
|
+
if @@custom_options.respond_to?(:call)
|
21
|
+
@@custom_options.call(event)
|
22
|
+
else
|
23
|
+
@@custom_options
|
24
|
+
end
|
25
|
+
end
|
9
26
|
|
10
27
|
def self.remove_existing_log_subscriptions
|
11
|
-
%w(redirect_to process_action start_processing send_data write_fragment exist_fragment?
|
28
|
+
%w(redirect_to process_action start_processing send_data send_file write_fragment read_fragment exist_fragment? expire_fragment expire_page write_page).each do |event|
|
12
29
|
unsubscribe_from_event(:action_controller, event)
|
13
30
|
end
|
14
31
|
|
15
32
|
%w{render_template render_partial render_collection}.each do |event|
|
16
|
-
unsubscribe_from_event(:action_view, event)
|
33
|
+
unsubscribe_from_event(:action_view, event)
|
17
34
|
end
|
18
35
|
end
|
19
36
|
|
@@ -27,10 +44,11 @@ module Lograge
|
|
27
44
|
end
|
28
45
|
|
29
46
|
def self.setup(app)
|
30
|
-
app.config.action_dispatch.rack_cache[:verbose] = false
|
47
|
+
app.config.action_dispatch.rack_cache[:verbose] = false if app.config.action_dispatch.rack_cache
|
31
48
|
require 'lograge/rails_ext/rack/logger'
|
32
49
|
Lograge.remove_existing_log_subscriptions
|
33
50
|
Lograge::RequestLogSubscriber.attach_to :action_controller
|
51
|
+
Lograge.custom_options = app.config.lograge.custom_options
|
34
52
|
end
|
35
53
|
end
|
36
54
|
|
@@ -9,6 +9,7 @@ module Lograge
|
|
9
9
|
message << extract_status(payload)
|
10
10
|
message << runtimes(event)
|
11
11
|
message << location(event)
|
12
|
+
message << custom_options(event)
|
12
13
|
logger.info(message)
|
13
14
|
end
|
14
15
|
|
@@ -27,6 +28,14 @@ module Lograge
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
31
|
+
def custom_options(event)
|
32
|
+
message = ""
|
33
|
+
(Lograge.custom_options(event) || {}).each do |name, value|
|
34
|
+
message << " #{name}=#{value}"
|
35
|
+
end
|
36
|
+
message
|
37
|
+
end
|
38
|
+
|
30
39
|
def runtimes(event)
|
31
40
|
message = ""
|
32
41
|
{:duration => event.duration,
|
@@ -40,10 +49,10 @@ module Lograge
|
|
40
49
|
def location(event)
|
41
50
|
if location = Thread.current[:lograge_location]
|
42
51
|
Thread.current[:lograge_location] = nil
|
43
|
-
"location=#{location}"
|
52
|
+
" location=#{location}"
|
44
53
|
else
|
45
54
|
""
|
46
55
|
end
|
47
|
-
end
|
56
|
+
end
|
48
57
|
end
|
49
58
|
end
|
data/lib/lograge/version.rb
CHANGED
data/lograge.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Lograge::VERSION
|
8
8
|
s.authors = ["Mathias Meyer"]
|
9
9
|
s.email = ["meyer@paperplanes.de"]
|
10
|
-
s.homepage = ""
|
10
|
+
s.homepage = "https://github.com/mattmatt/lograge"
|
11
11
|
s.summary = %q{Tame Rails' multi-line logging into a single line per request}
|
12
12
|
s.description = %q{Tame Rails' multi-line logging into a single line per request}
|
13
13
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'lograge'
|
2
3
|
require 'lograge/log_subscriber'
|
3
4
|
require 'active_support/notifications'
|
4
5
|
require 'active_support/core_ext/string'
|
@@ -14,7 +15,7 @@ describe Lograge::RequestLogSubscriber do
|
|
14
15
|
logger
|
15
16
|
}
|
16
17
|
before do
|
17
|
-
Lograge::RequestLogSubscriber.logger = logger
|
18
|
+
Lograge::RequestLogSubscriber.logger = logger
|
18
19
|
end
|
19
20
|
|
20
21
|
let(:subscriber) {Lograge::RequestLogSubscriber.new}
|
@@ -44,7 +45,7 @@ describe Lograge::RequestLogSubscriber do
|
|
44
45
|
subscriber.process_action(event)
|
45
46
|
log_output.string.starts_with?('GET').should == true
|
46
47
|
end
|
47
|
-
|
48
|
+
|
48
49
|
it "should include the status code" do
|
49
50
|
subscriber.process_action(event)
|
50
51
|
log_output.string.should include('status=200')
|
@@ -85,7 +86,7 @@ describe Lograge::RequestLogSubscriber do
|
|
85
86
|
|
86
87
|
it "should add the location to the log line" do
|
87
88
|
subscriber.process_action(event)
|
88
|
-
log_output.string.should =~ %r{location=http://www.example.com}
|
89
|
+
log_output.string.should =~ %r{ location=http://www.example.com}
|
89
90
|
end
|
90
91
|
|
91
92
|
it "should remove the thread local variable" do
|
@@ -93,13 +94,31 @@ describe Lograge::RequestLogSubscriber do
|
|
93
94
|
Thread.current[:lograge_location].should == nil
|
94
95
|
end
|
95
96
|
end
|
96
|
-
|
97
|
+
|
97
98
|
it "should not include a location by default" do
|
98
99
|
subscriber.process_action(event)
|
99
100
|
log_output.string.should_not =~ /location=/
|
100
101
|
end
|
101
102
|
end
|
102
103
|
|
104
|
+
describe "with custom_options configured" do
|
105
|
+
it "should combine the hash properly for the output" do
|
106
|
+
Lograge.custom_options = {:data => "value"}
|
107
|
+
subscriber.process_action(event)
|
108
|
+
log_output.string.should =~ / data=value/
|
109
|
+
end
|
110
|
+
it "should combine the output of a lambda properly" do
|
111
|
+
Lograge.custom_options = lambda {|event| {:data => "value"}}
|
112
|
+
subscriber.process_action(event)
|
113
|
+
log_output.string.should =~ / data=value/
|
114
|
+
end
|
115
|
+
it "should work if the method returns nil" do
|
116
|
+
Lograge.custom_options = lambda {|event| nil}
|
117
|
+
subscriber.process_action(event)
|
118
|
+
log_output.string.should be_present
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
103
122
|
describe "when processing a redirect" do
|
104
123
|
it "should store the location in a thread local variable" do
|
105
124
|
subscriber.redirect_to(redirect)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lograge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70345743126700 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70345743126700
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: guard-rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70345743136340 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70345743136340
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activesupport
|
38
|
-
requirement: &
|
38
|
+
requirement: &70345743177800 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70345743177800
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: actionpack
|
49
|
-
requirement: &
|
49
|
+
requirement: &70345743191500 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70345743191500
|
58
58
|
description: Tame Rails' multi-line logging into a single line per request
|
59
59
|
email:
|
60
60
|
- meyer@paperplanes.de
|
@@ -78,7 +78,7 @@ files:
|
|
78
78
|
- spec/lograge_logsubscriber_spec.rb
|
79
79
|
- spec/lograge_spec.rb
|
80
80
|
- spec/spec_helper.rb
|
81
|
-
homepage:
|
81
|
+
homepage: https://github.com/mattmatt/lograge
|
82
82
|
licenses: []
|
83
83
|
post_install_message:
|
84
84
|
rdoc_options: []
|