low 0.0.10 → 0.0.11
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/Gemfile.lock +1 -1
- data/lib/low/middleware/log_level.rb +32 -0
- data/lib/low/middleware/rack_errors.rb +33 -0
- data/lib/low/middleware/request_logger.rb +9 -50
- data/lib/low/version.rb +1 -1
- data/lib/low.rb +2 -0
- data/spec/low/middleware/log_level_spec.rb +62 -0
- data/spec/low/middleware/rack_errors_spec.rb +42 -0
- data/spec/low/middleware/request_logger_spec.rb +11 -52
- metadata +8 -2
data/Gemfile.lock
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Low
|
4
|
+
module Middleware
|
5
|
+
class LogLevel
|
6
|
+
|
7
|
+
DEFAULT_DEFAULT_LEVEL = Logger::INFO
|
8
|
+
|
9
|
+
def initialize(app, opts = {})
|
10
|
+
@app = app
|
11
|
+
@default_level = opts[:default_level] || DEFAULT_DEFAULT_LEVEL
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
env['low.log_level'] = log_level
|
16
|
+
@app.call(env)
|
17
|
+
end
|
18
|
+
|
19
|
+
def log_level
|
20
|
+
# If `LOG_LEVEL` is a valid level
|
21
|
+
if ['FATAL', 'ERROR', 'WARN', 'INFO', 'DEBUG'].include? ENV['LOG_LEVEL']
|
22
|
+
# use it;
|
23
|
+
eval "Logger::#{ENV['LOG_LEVEL']}"
|
24
|
+
else
|
25
|
+
# otherwise, use the default
|
26
|
+
@default_level
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Low
|
2
|
+
module Middleware
|
3
|
+
class RackErrors
|
4
|
+
|
5
|
+
DEFAULT_FS_ENVS = ['development', 'test']
|
6
|
+
|
7
|
+
def initialize(app, opts = {})
|
8
|
+
@app = app
|
9
|
+
@fs_envs = opts[:fs_envs] || DEFAULT_FS_ENVS
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
env['rack.errors'] = io
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def io
|
18
|
+
# If `RACK_ENV` should log to the FS,
|
19
|
+
if @fs_envs.include? ENV['RACK_ENV']
|
20
|
+
# make sure the log directory exists,
|
21
|
+
Dir.mkdir('log') unless Dir.exists?('log')
|
22
|
+
|
23
|
+
# and log to an eponymous file;
|
24
|
+
File.open("log/#{ENV['RACK_ENV']}.log", 'a')
|
25
|
+
else
|
26
|
+
# otherwise, log to STDOUT (Heroku likes it this way).
|
27
|
+
STDOUT
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -2,67 +2,26 @@ require 'logger'
|
|
2
2
|
|
3
3
|
module Low
|
4
4
|
module Middleware
|
5
|
-
# `RequestLogger`
|
6
|
-
# `Low::ScopedLogger`, with
|
7
|
-
# of the request:
|
8
|
-
# * _IO_: if RACK_ENV is development or test, use an eponymous file in
|
9
|
-
# the log directory, otherwise use STDOUT (as Heroku likes).
|
10
|
-
# * _log_level_: If set, use the LOG_LEVEL environment variable value;
|
11
|
-
# otherwise, use INFO.
|
12
|
-
# * _group_key_: Use request_id env value (see the RequestId middleware).
|
5
|
+
# `RequestLogger` sets 'rack.logger' to an instance of
|
6
|
+
# `Low::ScopedLogger`, with `#level` and `#scope` taken from env.
|
13
7
|
class RequestLogger
|
14
|
-
def self.level
|
15
|
-
# If `LOG_LEVEL` is a valid level other than INFO,
|
16
|
-
if ['FATAL', 'ERROR', 'WARN', 'DEBUG'].include? ENV['LOG_LEVEL']
|
17
|
-
# use it;
|
18
|
-
eval "::Logger::#{ENV['LOG_LEVEL']}"
|
19
|
-
else
|
20
|
-
# otherwise, use `::Logger::INFO`
|
21
|
-
::Logger::INFO
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.io
|
26
|
-
# If `RACK_ENV` is development or test,
|
27
|
-
if ['development', 'test'].include? ENV['RACK_ENV']
|
28
|
-
# make sure the log directory exists,
|
29
|
-
Dir.mkdir('log') unless Dir.exists?('log')
|
30
|
-
|
31
|
-
# and log to the appropriate file;
|
32
|
-
File.open("log/#{ENV['RACK_ENV']}.log", 'a')
|
33
|
-
else
|
34
|
-
# otherwise, log to STDOUT (Heroku likes it this way).
|
35
|
-
STDOUT
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
DEFAULT_KEY = 'logger'
|
40
8
|
|
41
9
|
def initialize(app, opts = {})
|
42
10
|
@app = app
|
43
|
-
@key = opts[:key] || DEFAULT_KEY
|
44
11
|
end
|
45
12
|
|
46
13
|
def call(env)
|
47
|
-
|
48
|
-
|
49
|
-
|
14
|
+
env['rack.logger'] = logger(env)
|
15
|
+
@app.call(env)
|
16
|
+
end
|
50
17
|
|
51
|
-
|
18
|
+
def logger(env)
|
52
19
|
logger = Low::ScopedLogger.new(env['rack.errors'])
|
53
|
-
|
54
|
-
# set the logger level to the above `Logger.level`,
|
55
|
-
logger.level = RequestLogger.level
|
56
|
-
|
57
|
-
# set the request_id if one is available
|
20
|
+
logger.level = env['low.log_level'] || env['log_level']
|
58
21
|
logger.scope = env['request_id']
|
59
|
-
|
60
|
-
# add it to the env,
|
61
|
-
env[@key] = logger
|
62
|
-
|
63
|
-
# and call the app
|
64
|
-
@app.call(env)
|
22
|
+
logger
|
65
23
|
end
|
24
|
+
|
66
25
|
end
|
67
26
|
end
|
68
27
|
end
|
data/lib/low/version.rb
CHANGED
data/lib/low.rb
CHANGED
@@ -5,6 +5,8 @@ module Low
|
|
5
5
|
autoload :Mongo, 'low/mongo'
|
6
6
|
|
7
7
|
module Middleware
|
8
|
+
autoload :LogLevel, 'low/middleware/log_level'
|
9
|
+
autoload :RackErrors, 'low/middleware/rack_errors'
|
8
10
|
autoload :RequestId, 'low/middleware/request_id'
|
9
11
|
autoload :RequestLogger, 'low/middleware/request_logger'
|
10
12
|
autoload :SubdomainMap, 'low/middleware/subdomain_map'
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
describe Low::Middleware::LogLevel do
|
5
|
+
def test_app
|
6
|
+
lambda do |env|
|
7
|
+
[200, {'Content-Type' => 'text/plain'}, env['low.log_level']]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
before(:all) { @original_log_level = ENV['LOG_LEVEL'] }
|
12
|
+
after(:each) { ENV['LOG_LEVEL'] = @original_log_level }
|
13
|
+
|
14
|
+
it 'should set low.log_level to `Logger::FATAL` if LOG_LEVEL is \'FATAL\'' do
|
15
|
+
ENV['LOG_LEVEL'] = 'FATAL'
|
16
|
+
rack = Low::Middleware::LogLevel.new test_app
|
17
|
+
response = rack.call({})
|
18
|
+
response[2].should == Logger::FATAL
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should set low.log_level to `Logger::ERROR` if LOG_LEVEL is \'ERROR\'' do
|
22
|
+
ENV['LOG_LEVEL'] = 'ERROR'
|
23
|
+
rack = Low::Middleware::LogLevel.new test_app
|
24
|
+
response = rack.call({})
|
25
|
+
response[2].should == Logger::ERROR
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should set low.log_level to `Logger::WARN` if LOG_LEVEL is \'WARN\'' do
|
29
|
+
ENV['LOG_LEVEL'] = 'WARN'
|
30
|
+
rack = Low::Middleware::LogLevel.new test_app
|
31
|
+
response = rack.call({})
|
32
|
+
response[2].should == Logger::WARN
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should set low.log_level to `Logger::INFO` if LOG_LEVEL is \'INFO\'' do
|
36
|
+
ENV['LOG_LEVEL'] = 'INFO'
|
37
|
+
rack = Low::Middleware::LogLevel.new test_app
|
38
|
+
response = rack.call({})
|
39
|
+
response[2].should == Logger::INFO
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should set low.log_level to `Logger::DEBUG` if LOG_LEVEL is \'DEBUG\'' do
|
43
|
+
ENV['LOG_LEVEL'] = 'DEBUG'
|
44
|
+
rack = Low::Middleware::LogLevel.new test_app
|
45
|
+
response = rack.call({})
|
46
|
+
response[2].should == Logger::DEBUG
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should set low.log_level to `Logger::INFO` if neither LOG_LEVEL nor `:default_level` is set' do
|
50
|
+
ENV['LOG_LEVEL'] = nil
|
51
|
+
rack = Low::Middleware::LogLevel.new test_app
|
52
|
+
response = rack.call({})
|
53
|
+
response[2].should == Logger::INFO
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should set low.log_level to the specified `:default_level` if LOG_LEVEL is not set' do
|
57
|
+
ENV['LOG_LEVEL'] = nil
|
58
|
+
rack = Low::Middleware::LogLevel.new test_app, default_level: Logger::DEBUG
|
59
|
+
response = rack.call({})
|
60
|
+
response[2].should == Logger::DEBUG
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Low::Middleware::RackErrors do
|
5
|
+
def test_app
|
6
|
+
lambda do |env|
|
7
|
+
[200, {'Content-Type' => 'text/plain'}, env['rack.errors']]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
ENV['RACK_ENV'] = 'test'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should log to the FS in the development RACK_ENV by default' do
|
16
|
+
ENV['RACK_ENV'] = 'development'
|
17
|
+
rack = Low::Middleware::RackErrors.new test_app
|
18
|
+
response = rack.call({})
|
19
|
+
response[2].path.should == 'log/development.log'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should log to the FS in the test RACK_ENV by default' do
|
23
|
+
ENV['RACK_ENV'] = 'test'
|
24
|
+
rack = Low::Middleware::RackErrors.new test_app
|
25
|
+
response = rack.call({})
|
26
|
+
response[2].path.should == 'log/test.log'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should log to the FS in the specified RACK_ENV' do
|
30
|
+
ENV['RACK_ENV'] = 'production'
|
31
|
+
rack = Low::Middleware::RackErrors.new test_app, fs_envs: ['production']
|
32
|
+
response = rack.call({})
|
33
|
+
response[2].path.should == 'log/production.log'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should log to STDOUT if not in a specified RACK_ENV' do
|
37
|
+
ENV['RACK_ENV'] = 'production'
|
38
|
+
rack = Low::Middleware::RackErrors.new test_app
|
39
|
+
response = rack.call({})
|
40
|
+
response[2].should == STDOUT
|
41
|
+
end
|
42
|
+
end
|
@@ -2,60 +2,19 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
require 'logger'
|
3
3
|
|
4
4
|
describe Low::Middleware::RequestLogger do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Low::Middleware::RequestLogger.level.should == Logger::FATAL
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should return Logger::ERROR if the LOG_LEVEL evironment var is \'ERROR\'' do
|
12
|
-
ENV['LOG_LEVEL'] = 'ERROR'
|
13
|
-
Low::Middleware::RequestLogger.level.should == Logger::ERROR
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should return Logger::WARN if the LOG_LEVEL evironment var is \'WARN\'' do
|
17
|
-
ENV['LOG_LEVEL'] = 'WARN'
|
18
|
-
Low::Middleware::RequestLogger.level.should == Logger::WARN
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should return Logger::INFO if the LOG_LEVEL evironment var is \'INFO\'' do
|
22
|
-
ENV['LOG_LEVEL'] = 'INFO'
|
23
|
-
Low::Middleware::RequestLogger.level.should == Logger::INFO
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should return Logger::DEBUG if the LOG_LEVEL evironment var is \'DEBUG\'' do
|
27
|
-
ENV['LOG_LEVEL'] = 'DEBUG'
|
28
|
-
Low::Middleware::RequestLogger.level.should == Logger::DEBUG
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should return Logger::INFO if the LOG_LEVEL evironment var is not set' do
|
32
|
-
ENV['LOG_LEVEL'] = nil
|
33
|
-
Low::Middleware::RequestLogger.level.should == Logger::INFO
|
5
|
+
def test_app
|
6
|
+
lambda do |env|
|
7
|
+
[200, {'Content-Type' => 'text/plain'}, env['rack.logger']]
|
34
8
|
end
|
35
9
|
end
|
36
10
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'should return \'log/test.log\' if the RACK_ENV evironment var is \'test\'' do
|
48
|
-
ENV['RACK_ENV'] = 'test'
|
49
|
-
Low::Middleware::RequestLogger.io.path.should == 'log/test.log'
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'should return STDOUT if the RACK_ENV evironment var is \'production\'' do
|
53
|
-
begin
|
54
|
-
ENV['RACK_ENV'] = 'production'
|
55
|
-
Low::Middleware::RequestLogger.io.should == STDOUT
|
56
|
-
ensure
|
57
|
-
ENV['RACK_ENV'] = 'test'
|
58
|
-
end
|
59
|
-
end
|
11
|
+
it 'should set rack.logger to an instance of `Low::ScopedLogger` with scope set to \'request_id\'
|
12
|
+
and level set to \'low.log_level\'' do
|
13
|
+
rack = Low::Middleware::RequestLogger.new test_app
|
14
|
+
response = rack.call({'request_id' => 'abc123', 'low.log_level' => Logger::FATAL})
|
15
|
+
logger = response[2]
|
16
|
+
logger.should be_a(Low::ScopedLogger)
|
17
|
+
logger.scope.should == 'abc123'
|
18
|
+
logger.level.should == Logger::FATAL
|
60
19
|
end
|
61
20
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: low
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -105,6 +105,8 @@ files:
|
|
105
105
|
- README.md
|
106
106
|
- Rakefile
|
107
107
|
- lib/low.rb
|
108
|
+
- lib/low/middleware/log_level.rb
|
109
|
+
- lib/low/middleware/rack_errors.rb
|
108
110
|
- lib/low/middleware/request_id.rb
|
109
111
|
- lib/low/middleware/request_logger.rb
|
110
112
|
- lib/low/middleware/subdomain_map.rb
|
@@ -114,6 +116,8 @@ files:
|
|
114
116
|
- lib/low/scoped_logger.rb
|
115
117
|
- lib/low/version.rb
|
116
118
|
- low.gemspec
|
119
|
+
- spec/low/middleware/log_level_spec.rb
|
120
|
+
- spec/low/middleware/rack_errors_spec.rb
|
117
121
|
- spec/low/middleware/request_id_spec.rb
|
118
122
|
- spec/low/middleware/request_logger_spec.rb
|
119
123
|
- spec/low/middleware/subdomain_map_spec.rb
|
@@ -146,6 +150,8 @@ signing_key:
|
|
146
150
|
specification_version: 3
|
147
151
|
summary: A low-level utility library.
|
148
152
|
test_files:
|
153
|
+
- spec/low/middleware/log_level_spec.rb
|
154
|
+
- spec/low/middleware/rack_errors_spec.rb
|
149
155
|
- spec/low/middleware/request_id_spec.rb
|
150
156
|
- spec/low/middleware/request_logger_spec.rb
|
151
157
|
- spec/low/middleware/subdomain_map_spec.rb
|