sinatra-log 0.0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -0
- data/lib/sinatra/log.rb +30 -15
- data/lib/sinatra/version.rb +1 -1
- data/spec/{logger_spec.rb → formatter_spec.rb} +15 -54
- data/spec/log_spec.rb +41 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d330d9392783361671201bbfd7edd7896a428038
|
4
|
+
data.tar.gz: fe9491f7f176995b96ead97d92fb817430d2018c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98a409b0fa7bbc3f053ecb42572ab353c13825df433a4564b33ee1ec67e96da9ef7248e7909beea08d753622e6252a58ed9539f81d8362e2dc7b31fc0bf2c007
|
7
|
+
data.tar.gz: 8058cd7f3c28ebf9083cc0a90227ccdc46b9c7e0deff7309ceafe02ee9c196339a14222ee5a55b7dcee02673c7ed3d80faa6d44d7891e8b4af1e0bcda8326015
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# A Sinatra Logger ![Build Status][1]
|
2
|
+
|
3
|
+
### History
|
4
|
+
|
5
|
+
I wrote this wrapper around log4r in 2014 for a small Sinatra project at
|
6
|
+
[Lookout][4]. As the project ended, the code was pulled out
|
7
|
+
and open sourced by [ismith][3] and included in [lookout-rack-utils][2].
|
8
|
+
|
9
|
+
### Changes
|
10
|
+
|
11
|
+
It is mostly unchanged here, though configuration is done through the logging
|
12
|
+
constructor, not through configatron. Graphite logging was also thrown out,
|
13
|
+
though that could be re-added if desired. And of course there was a namespace
|
14
|
+
change.
|
15
|
+
|
16
|
+
### Purpose
|
17
|
+
|
18
|
+
This was written for usage in Sinatra -- as logging isn't provide outside of
|
19
|
+
request context. But it could be used in any Ruby project.
|
20
|
+
|
21
|
+
[1]: https://api.travis-ci.org/svrana/sinatra-log.svg?branch=master
|
22
|
+
[2]: https://github.com/lookout/lookout-rack-utils.git
|
23
|
+
[3]: https://github.com/ismith
|
24
|
+
[4]: https://lookout.com
|
data/lib/sinatra/log.rb
CHANGED
@@ -3,38 +3,53 @@ require 'log4r'
|
|
3
3
|
require 'time'
|
4
4
|
|
5
5
|
module Sinatra
|
6
|
-
#
|
6
|
+
# Logs to specified filename with the format:
|
7
7
|
#
|
8
8
|
# [Log Level]: [Timestamp (ISO-8601)]: [File:linenum]: [Log Message]
|
9
9
|
#
|
10
|
-
#
|
11
|
-
# log.warn 'This is my log message'
|
10
|
+
# Access is usually wrapped in a class helper:
|
12
11
|
#
|
12
|
+
# class MyProject
|
13
|
+
# self.log
|
14
|
+
# @logger ||= Sinatra::Log.new(:logger_name => 'myproject',
|
15
|
+
# :log_filename => 'myproject/dev.log',
|
16
|
+
# :loglevel => 'WARN',
|
17
|
+
# :enabled => true,
|
18
|
+
# :project_dir => '/var/opt/myproj')
|
19
|
+
# end
|
20
|
+
# end
|
13
21
|
class Log
|
14
22
|
include Log4r
|
15
23
|
|
24
|
+
REQUIRED_CONFIG_SYMBOLS = [:logger_name, :loglevel, :log_filename,
|
25
|
+
:enabled].freeze
|
26
|
+
|
16
27
|
# Formatter that include the filename and relative path, and line number in
|
17
28
|
# output of the caller.
|
18
29
|
#
|
19
30
|
# Since all callers go through the methods defined in this class to log, we
|
20
31
|
# look at the second line of the tracer output, removing everything but the
|
21
32
|
# directories after the project directory.
|
22
|
-
#
|
23
33
|
class DefaultFormatter < Log4r::Formatter
|
24
|
-
|
25
|
-
|
26
|
-
#
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
@basedir
|
34
|
+
attr_reader :basedir
|
35
|
+
|
36
|
+
# @param [String] basedir The base project directory; this directory
|
37
|
+
# will be filtered out from each log entry if specified.
|
38
|
+
def initialize(basedir = nil)
|
39
|
+
super
|
40
|
+
@basedir = basedir
|
31
41
|
end
|
32
42
|
|
33
43
|
# Return a trimmed version of the filename from where a LogEvent occurred
|
44
|
+
#
|
34
45
|
# @param [String] tracer A line from the LogEvent#tracer Array
|
35
46
|
# @return [String] Trimmed and parsed version of the file ane line number
|
36
47
|
def event_filename(tracer)
|
37
|
-
|
48
|
+
if basedir.nil?
|
49
|
+
parts = tracer.match(/(.*:[0-9]+).*:/)
|
50
|
+
else
|
51
|
+
parts = tracer.match(/#{basedir}\/(.*:[0-9]+).*:/)
|
52
|
+
end
|
38
53
|
|
39
54
|
# If we get no matches back, we're probably in a jar file in which case
|
40
55
|
# the format of the tracer is going to be abbreviated
|
@@ -60,12 +75,12 @@ module Sinatra
|
|
60
75
|
|
61
76
|
def initialize(config={})
|
62
77
|
errors = []
|
63
|
-
|
78
|
+
REQUIRED_CONFIG_SYMBOLS.each do |key|
|
64
79
|
if !config.include?(key)
|
65
80
|
errors << "#{key} required, but not specified in config hash"
|
66
81
|
end
|
67
|
-
raise ArgumentError, "#{errors}" if errors.count > 0
|
68
82
|
end
|
83
|
+
raise ArgumentError, "#{errors}" if errors.count > 0
|
69
84
|
|
70
85
|
logger_name = config[:logger_name].to_s.gsub(/\s+/, '_')
|
71
86
|
@logger = Log4r::Logger.new(logger_name)
|
@@ -82,7 +97,7 @@ module Sinatra
|
|
82
97
|
:filename => config[:log_filename],
|
83
98
|
:trunc => false)
|
84
99
|
@logger.trace = true
|
85
|
-
@outputter.formatter = DefaultFormatter
|
100
|
+
@outputter.formatter = DefaultFormatter.new(config[:project_dir])
|
86
101
|
@logger.outputters = @outputter
|
87
102
|
end
|
88
103
|
|
data/lib/sinatra/version.rb
CHANGED
@@ -2,55 +2,15 @@ require 'spec_helper'
|
|
2
2
|
require 'sinatra/log'
|
3
3
|
require 'timecop'
|
4
4
|
|
5
|
-
describe Sinatra::Log do
|
6
|
-
let(:myconfig) do
|
7
|
-
{
|
8
|
-
:enabled => true,
|
9
|
-
:logger_name => 'mylogger',
|
10
|
-
:loglevel => 'DEBUG',
|
11
|
-
:log_filename => 'log'
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
|
-
subject(:log) { Sinatra::Log.new(myconfig) }
|
16
|
-
subject(:log_message) { 'foo' }
|
17
|
-
|
18
|
-
[:debug, :info, :warn, :error, :fatal].each do |method|
|
19
|
-
describe ".#{method}" do
|
20
|
-
it 'should invoke the internal logger object with a given block' do
|
21
|
-
log.instance_variable_get(:@logger).should_receive(method).with(log_message).and_call_original
|
22
|
-
processed = false
|
23
|
-
b = Proc.new { processed = true }
|
24
|
-
log.send(method, log_message, &b)
|
25
|
-
expect(processed).to be(true)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should invoke the internal logger object w/o a given block' do
|
29
|
-
log.instance_variable_get(:@logger).should_receive(method).with(log_message).and_call_original
|
30
|
-
log.send(method, log_message)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
[:debug?, :info?, :warn?, :error?, :fatal?].each do |method|
|
36
|
-
describe ".#{method}" do
|
37
|
-
it 'returns true when level is debug' do
|
38
|
-
expect(log.send(method)).to eq(true)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
5
|
describe Sinatra::Log::DefaultFormatter do
|
45
|
-
|
6
|
+
let(:project_name) { 'some_project' }
|
7
|
+
let(:basedir) { "/home/proj/backend/#{project_name}" }
|
46
8
|
let(:logger) do
|
47
9
|
logger = double('Mock Logger')
|
48
10
|
logger.stub(:name).and_return('RSpec Logger')
|
49
11
|
logger.stub(:fullname).and_return('RSpec Logger')
|
50
12
|
logger
|
51
13
|
end
|
52
|
-
let(:project_name) { 'some_project' }
|
53
|
-
let(:basedir) { "/home/rspec/#{project_name}" }
|
54
14
|
let(:tracer) do
|
55
15
|
[
|
56
16
|
"#{basedir}/log.rb:63:in `warn'",
|
@@ -58,23 +18,27 @@ describe Sinatra::Log::DefaultFormatter do
|
|
58
18
|
]
|
59
19
|
end
|
60
20
|
|
21
|
+
subject(:formatter) { described_class.new(basedir) }
|
22
|
+
|
61
23
|
before :all do
|
62
24
|
# The root logger creates the log levels, so making sure it's been
|
63
25
|
# created
|
64
26
|
Log4r::RootLogger.instance
|
65
27
|
end
|
66
28
|
|
67
|
-
|
68
|
-
before :each do
|
69
|
-
formatter.stub(:basedir).and_return(basedir)
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
29
|
describe '#event_filename' do
|
74
30
|
subject(:filename) { formatter.event_filename(tracer[1]) }
|
75
31
|
|
76
|
-
context 'with
|
77
|
-
|
32
|
+
context 'with the project name specified' do
|
33
|
+
context 'with a normal MRI LogEvent' do
|
34
|
+
it { should eql('spec/log_spec.rb:9') }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'without the project name specified' do
|
39
|
+
let(:formatter) { described_class.new }
|
40
|
+
|
41
|
+
it { should eql("#{basedir}/spec/log_spec.rb:9") }
|
78
42
|
end
|
79
43
|
|
80
44
|
# We have slightly different log formats under packaged .jar files
|
@@ -100,10 +64,7 @@ describe Sinatra::Log::DefaultFormatter do
|
|
100
64
|
let(:level) { 3 }
|
101
65
|
let(:data) { 'rspec' }
|
102
66
|
let(:timestamp) { Time.now.utc.iso8601 }
|
103
|
-
|
104
|
-
let(:event) do
|
105
|
-
event = Log4r::LogEvent.new(level, logger, tracer, data)
|
106
|
-
end
|
67
|
+
let(:event) { Log4r::LogEvent.new(level, logger, tracer, data) }
|
107
68
|
|
108
69
|
it 'should be properly formatted' do
|
109
70
|
expect(formatter.format(event)).to eql("WARN: #{timestamp}: spec/log_spec.rb:9: #{data}\n")
|
data/spec/log_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sinatra/log'
|
3
|
+
|
4
|
+
describe Sinatra::Log do
|
5
|
+
let(:myconfig) do
|
6
|
+
{
|
7
|
+
:enabled => true,
|
8
|
+
:logger_name => 'mylogger',
|
9
|
+
:loglevel => 'DEBUG',
|
10
|
+
:log_filename => 'log'
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
subject(:log) { Sinatra::Log.new(myconfig) }
|
15
|
+
subject(:log_message) { 'foo' }
|
16
|
+
|
17
|
+
[:debug, :info, :warn, :error, :fatal].each do |method|
|
18
|
+
describe ".#{method}" do
|
19
|
+
it 'should invoke the internal logger object with a given block' do
|
20
|
+
log.instance_variable_get(:@logger).should_receive(method).with(log_message).and_call_original
|
21
|
+
processed = false
|
22
|
+
b = Proc.new { processed = true }
|
23
|
+
log.send(method, log_message, &b)
|
24
|
+
expect(processed).to be(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should invoke the internal logger object w/o a given block' do
|
28
|
+
log.instance_variable_get(:@logger).should_receive(method).with(log_message).and_call_original
|
29
|
+
log.send(method, log_message)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
[:debug?, :info?, :warn?, :error?, :fatal?].each do |method|
|
35
|
+
describe ".#{method}" do
|
36
|
+
it 'returns true when level is debug' do
|
37
|
+
expect(log.send(method)).to eq(true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaw Vrana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,11 +106,13 @@ files:
|
|
106
106
|
- ".travis.yml"
|
107
107
|
- Gemfile
|
108
108
|
- LICENSE.txt
|
109
|
+
- README.md
|
109
110
|
- Rakefile
|
110
111
|
- lib/sinatra/log.rb
|
111
112
|
- lib/sinatra/version.rb
|
112
113
|
- sinatra-log.gemspec
|
113
|
-
- spec/
|
114
|
+
- spec/formatter_spec.rb
|
115
|
+
- spec/log_spec.rb
|
114
116
|
- spec/spec_helper.bak.rb
|
115
117
|
- spec/spec_helper.rb
|
116
118
|
homepage: http://github.com/svrana/sinatra-log
|
@@ -138,6 +140,7 @@ signing_key:
|
|
138
140
|
specification_version: 4
|
139
141
|
summary: ''
|
140
142
|
test_files:
|
141
|
-
- spec/
|
143
|
+
- spec/formatter_spec.rb
|
144
|
+
- spec/log_spec.rb
|
142
145
|
- spec/spec_helper.bak.rb
|
143
146
|
- spec/spec_helper.rb
|