logger-better 0.1.3 → 0.2.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/README.md +47 -2
- data/RELEASE_NOTES.md +26 -0
- data/Rakefile +14 -2
- data/circle.yml +3 -0
- data/lib/logger-better.rb +100 -3
- data/lib/logger/better.rb +2 -36
- data/lib/logger/no_timestamp.rb +5 -0
- data/logger-better.gemspec +1 -5
- data/test/better_patch_test.rb +23 -0
- data/test/better_test.rb +8 -5
- data/test/no_timestamp_patch_test.rb +23 -0
- data/test/no_timestamp_test.rb +57 -0
- metadata +11 -3
- data/lib/logger-better/version.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6d88295a70c17338039ffd8e70b35019aff3d61
|
4
|
+
data.tar.gz: dfe4d323fd414fc884bb00389a14e073a30990bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03407ced98200a6e2cb6439f25cfbf923cee0604a93d3935804a6492dc9d4d54c252f9f3c22d938b9603ac23ef61c7c2e16e7c19e8d2b2fc97caab6cd4688a05
|
7
|
+
data.tar.gz: 58df092fccffee92e549a9e5d18f36215ae9c62c931a3ccac53fb73591ef78f0e92f25eab6753b43bfb8c11cffa1cbdfdb5957a28de77c42c6d3751231ce8f97
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# logger-better
|
2
2
|
|
3
|
-
Simple
|
3
|
+
Simple `Logger` subclasses to make it easier to use and print more
|
4
|
+
compact log messages. It also contains modules you can monkey patch
|
5
|
+
into `Logger` if you don't want to use the subclasses, or don't have
|
6
|
+
control over objects instantiating `Logger` instances.
|
4
7
|
|
5
8
|
I wrote this gem because I've done this same basic thing in many
|
6
9
|
projects and got tired of it.
|
@@ -22,10 +25,52 @@ Or install it yourself as:
|
|
22
25
|
## Enhancements
|
23
26
|
|
24
27
|
* Default log format is more readable: `2013-08-10T15:19:21Z [app#68530] INFO: hi`
|
25
|
-
*
|
28
|
+
* Includes a formatter without timestamps. Useful when your logging
|
29
|
+
solution automatically inserts them.
|
30
|
+
* Set `logger.level` with symbols. `logger.level = :info` (Works
|
31
|
+
nicely with `ENV['LOG_LEVEL']`)
|
26
32
|
* Provide a `NullLogger` object to be used in cases where you need to
|
27
33
|
tell some code to shut up.
|
28
34
|
|
35
|
+
## Usage
|
36
|
+
|
37
|
+
logger-better has two modes: subclasses and monkey patches to the
|
38
|
+
`Logger` class. Monkey patching is **OPT IN**. This library includes a
|
39
|
+
`Logger::Better` subclass. It just a subclass with the appropriate
|
40
|
+
modules included. `Logger::Better` instances will use bundled
|
41
|
+
formatter by default. `Logger::Better` also provides a factory for
|
42
|
+
creating timestampless loggers (using one of the bundled formatters).
|
43
|
+
|
44
|
+
### Sublcass Usage
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
require 'logger-better'
|
48
|
+
|
49
|
+
logger = Logger::Better.new $stdout
|
50
|
+
logger.info('testing') { 'Hello World' } # => 2013-08-10T15:19:21Z [app#68530] INFO: Hello World
|
51
|
+
|
52
|
+
# Notimestamp factory method behaves the same as new, just sets the
|
53
|
+
# default formatter
|
54
|
+
logger = Logger::Better.no_timestamp $stdout
|
55
|
+
logger.info('testing') { 'Hello World' } # => [app#68530] INFO: Hello World
|
56
|
+
```
|
57
|
+
|
58
|
+
### Monkey Patching Logger
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
require 'logger/better'
|
62
|
+
|
63
|
+
logger = Logger.new $stdout
|
64
|
+
logger.info('testing') { 'Hello World' } # => 2013-08-10T15:19:21Z [app#68530] INFO: Hello World
|
65
|
+
|
66
|
+
require 'logger/no_timestamp'
|
67
|
+
|
68
|
+
# Notimestamp factory method behaves the same as new, just sets the
|
69
|
+
# default formatter
|
70
|
+
logger = Logger.new $stdout
|
71
|
+
logger.info('testing') { 'Hello World' } # => [app#68530] INFO: Hello World
|
72
|
+
```
|
73
|
+
|
29
74
|
## Contributing
|
30
75
|
|
31
76
|
1. Fork it
|
data/RELEASE_NOTES.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Version 0.2.0
|
2
|
+
|
3
|
+
This version significantly reworks the internals and provides new
|
4
|
+
public facing features. This came out of real world experience using
|
5
|
+
the library in other projects. This release changes two things:
|
6
|
+
|
7
|
+
1. `Logger` is **NO LONGER** monkey patched by default
|
8
|
+
2. Add a formatter that does not include timestamps.
|
9
|
+
|
10
|
+
The first point was done to make this library a better citizen in the
|
11
|
+
ruby community by following this principle: global non-opt-in monkey
|
12
|
+
patching is bad and should be avoided. Monkey patching in itself is
|
13
|
+
fine, as long as the developers knows it's happening and has control
|
14
|
+
over it.
|
15
|
+
|
16
|
+
The second point is a minor enhancement but goes a long way in keeping
|
17
|
+
down the noise. Most distributed logging systems will insert their own
|
18
|
+
timestamp on all messages. This becomes annoying when your log
|
19
|
+
messages contain timestamps. This creates a bunch of noise and
|
20
|
+
pointless duplication. This functionality is available either via
|
21
|
+
monkey patch or subclass.
|
22
|
+
|
23
|
+
## Upgrading from 0.1.x
|
24
|
+
|
25
|
+
0.2.x is backward compatible with 0.1.0 depending on how the library
|
26
|
+
is required. `require 'logger/better'` will keep the 0.1.x behavior.
|
data/Rakefile
CHANGED
@@ -1,8 +1,20 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require 'rake/testtask'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
namespace :test do
|
5
|
+
Rake::TestTask.new :lib do |t|
|
6
|
+
t.test_files = Dir['test/**/*_test.rb']
|
7
|
+
end
|
8
|
+
|
9
|
+
task :require do
|
10
|
+
require 'bundler/setup'
|
11
|
+
require 'logger/better'
|
12
|
+
require 'logger/no_timestamp'
|
13
|
+
end
|
14
|
+
|
15
|
+
task ci: [ :lib, :require ]
|
6
16
|
end
|
7
17
|
|
18
|
+
task test: 'test:ci'
|
19
|
+
|
8
20
|
task default: :test
|
data/circle.yml
ADDED
data/lib/logger-better.rb
CHANGED
@@ -1,4 +1,101 @@
|
|
1
|
-
require "logger-better/version"
|
2
|
-
|
3
|
-
require_relative 'logger/better'
|
4
1
|
require_relative 'logger/null_logger'
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
class Logger
|
7
|
+
class Better < Logger
|
8
|
+
module LevelPatch
|
9
|
+
def level=(value)
|
10
|
+
if value.is_a? Symbol
|
11
|
+
@level = mapping.fetch(value, Logger::UNKNOWN)
|
12
|
+
else
|
13
|
+
@level = value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def mapping
|
18
|
+
{
|
19
|
+
debug: Logger::DEBUG,
|
20
|
+
info: Logger::INFO,
|
21
|
+
warn: Logger::WARN,
|
22
|
+
error: Logger::ERROR,
|
23
|
+
fatal: Logger::FATAL,
|
24
|
+
unknown: Logger::UNKNOWN
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
include LevelPatch
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def no_timestamp(*args, &block)
|
33
|
+
new(*args, &block).tap do |logger|
|
34
|
+
logger.formatter = NoTimestampFormatter.new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(*)
|
40
|
+
super
|
41
|
+
@formatter = TimestampFormatter.new
|
42
|
+
end
|
43
|
+
|
44
|
+
class TimestampFormatter < Formatter
|
45
|
+
def call(severity, time, progname, msg)
|
46
|
+
format % [
|
47
|
+
time.utc.iso8601,
|
48
|
+
progname,
|
49
|
+
$$,
|
50
|
+
severity,
|
51
|
+
msg2str(msg).strip
|
52
|
+
]
|
53
|
+
end
|
54
|
+
|
55
|
+
def format
|
56
|
+
"%s [%s#%d] %5s: %s\n"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class NoTimestampFormatter < Formatter
|
61
|
+
def call(severity, time, progname, msg)
|
62
|
+
format % [
|
63
|
+
progname,
|
64
|
+
$$,
|
65
|
+
severity,
|
66
|
+
msg2str(msg).strip
|
67
|
+
]
|
68
|
+
end
|
69
|
+
|
70
|
+
def format
|
71
|
+
"[%s#%d] %5s: %s\n"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
module BetterPatch
|
77
|
+
def initialize(*)
|
78
|
+
super
|
79
|
+
@formatter = Better::TimestampFormatter.new
|
80
|
+
end
|
81
|
+
|
82
|
+
class << self
|
83
|
+
def included(base)
|
84
|
+
base.include Better::LevelPatch
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
module NoTimestampPatch
|
90
|
+
def initialize(*)
|
91
|
+
super
|
92
|
+
@formatter = Better::NoTimestampFormatter.new
|
93
|
+
end
|
94
|
+
|
95
|
+
class << self
|
96
|
+
def included(base)
|
97
|
+
base.include Better::LevelPatch
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/logger/better.rb
CHANGED
@@ -1,39 +1,5 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'time'
|
1
|
+
require 'logger-better'
|
3
2
|
|
4
3
|
class Logger
|
5
|
-
|
6
|
-
if value.is_a? Symbol
|
7
|
-
@level = mapping.fetch(value, UNKNOWN)
|
8
|
-
else
|
9
|
-
@level = value
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def mapping
|
14
|
-
{
|
15
|
-
debug: DEBUG,
|
16
|
-
info: INFO,
|
17
|
-
warn: WARN,
|
18
|
-
error: ERROR,
|
19
|
-
fatal: FATAL,
|
20
|
-
unknown: UNKNOWN
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
class Formatter
|
25
|
-
def call(severity, time, progname, msg)
|
26
|
-
format % [
|
27
|
-
time.utc.iso8601,
|
28
|
-
progname,
|
29
|
-
$$,
|
30
|
-
severity,
|
31
|
-
msg2str(msg).strip
|
32
|
-
]
|
33
|
-
end
|
34
|
-
|
35
|
-
def format
|
36
|
-
"%s [%s#%d] %5s: %s\n"
|
37
|
-
end
|
38
|
-
end
|
4
|
+
include BetterPatch
|
39
5
|
end
|
data/logger-better.gemspec
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'logger-better/version'
|
5
|
-
|
6
2
|
Gem::Specification.new do |spec|
|
7
3
|
spec.name = "logger-better"
|
8
|
-
spec.version =
|
4
|
+
spec.version = "0.2.0"
|
9
5
|
spec.authors = ["ahawkins"]
|
10
6
|
spec.email = ["adam@hawkins.io"]
|
11
7
|
spec.description = %q{Simple monkey patch to stdlib's Logger to make it easier to use.}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class BetterPatchTest < MiniTest::Unit::TestCase
|
4
|
+
def test_patching_sets_correct_formatter_on_new_instances
|
5
|
+
patched_logger = Class.new(Logger) do
|
6
|
+
include Logger::BetterPatch
|
7
|
+
end
|
8
|
+
|
9
|
+
logger = patched_logger.new $stdout
|
10
|
+
assert_instance_of Logger::Better::TimestampFormatter, logger.formatter
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_patching_allows_setting_level_by_symbol
|
14
|
+
patched_logger = Class.new(Logger) do
|
15
|
+
include Logger::BetterPatch
|
16
|
+
end
|
17
|
+
|
18
|
+
logger = patched_logger.new $stdout
|
19
|
+
|
20
|
+
logger.level = :debug
|
21
|
+
assert_equal Logger::DEBUG, logger.level
|
22
|
+
end
|
23
|
+
end
|
data/test/better_test.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
|
-
require 'logger/better'
|
3
|
-
require 'stringio'
|
4
2
|
|
5
3
|
class BetterTest < MiniTest::Unit::TestCase
|
6
4
|
attr_reader :formatter
|
7
5
|
|
8
6
|
def setup
|
9
|
-
@formatter = Logger::
|
7
|
+
@formatter = Logger::Better::TimestampFormatter.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_uses_the_correct_formatter
|
11
|
+
logger = Logger::Better.new $stdout
|
12
|
+
assert_instance_of Logger::Better::TimestampFormatter, logger.formatter
|
10
13
|
end
|
11
14
|
|
12
15
|
def test_uses_utc_iso_8601_times
|
@@ -51,7 +54,7 @@ class BetterTest < MiniTest::Unit::TestCase
|
|
51
54
|
end
|
52
55
|
|
53
56
|
def test_can_set_level_with_symbol
|
54
|
-
logger = Logger.new StringIO.new
|
57
|
+
logger = Logger::Better.new StringIO.new
|
55
58
|
|
56
59
|
logger.level = :debug
|
57
60
|
assert_equal Logger::DEBUG, logger.level
|
@@ -68,7 +71,7 @@ class BetterTest < MiniTest::Unit::TestCase
|
|
68
71
|
end
|
69
72
|
|
70
73
|
def tests_sets_level_unkown_when_passing_an_unkown_symol
|
71
|
-
logger = Logger.new StringIO.new
|
74
|
+
logger = Logger::Better.new StringIO.new
|
72
75
|
|
73
76
|
logger.level = :foo
|
74
77
|
assert_equal Logger::UNKNOWN, logger.level
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class NoTimestampPatchTest < MiniTest::Unit::TestCase
|
4
|
+
def test_patching_sets_correct_formatter_on_new_instances
|
5
|
+
patched_logger = Class.new(Logger) do
|
6
|
+
include Logger::NoTimestampPatch
|
7
|
+
end
|
8
|
+
|
9
|
+
logger = patched_logger.new $stdout
|
10
|
+
assert_instance_of Logger::Better::NoTimestampFormatter, logger.formatter
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_patching_allows_setting_level_by_symbol
|
14
|
+
patched_logger = Class.new(Logger) do
|
15
|
+
include Logger::BetterPatch
|
16
|
+
end
|
17
|
+
|
18
|
+
logger = patched_logger.new $stdout
|
19
|
+
|
20
|
+
logger.level = :debug
|
21
|
+
assert_equal Logger::DEBUG, logger.level
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class NoTimestampTest < MiniTest::Unit::TestCase
|
4
|
+
attr_reader :formatter
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@formatter = Logger::Better::NoTimestampFormatter.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_building_loggers_without_timestamp
|
11
|
+
logger = Logger::Better.no_timestamp $stdout
|
12
|
+
assert_instance_of Logger::Better::NoTimestampFormatter, logger.formatter
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_does_not_include_the_time
|
16
|
+
time = Time.now
|
17
|
+
log = formatter.call 'info', time, 'app', 'hi'
|
18
|
+
refute_includes log, time.utc.iso8601
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_progname_is_first
|
22
|
+
log = formatter.call 'info', Time.now, 'app', 'hi'
|
23
|
+
# NOTE: format includes [ ] around progrname & PID, so this test
|
24
|
+
# really asserts that it's the first "text" in the output
|
25
|
+
assert_equal 1, log.index('app')
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_pid_comes_after_progname
|
29
|
+
log = formatter.call 'info', Time.now, 'app', 'hi'
|
30
|
+
assert_before log, $$.to_s, 'app'
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_level_comes_after_progname
|
34
|
+
log = formatter.call 'info', Time.now, 'app', 'hi'
|
35
|
+
assert_before log, 'info', $$.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_message_comes_last
|
39
|
+
log = formatter.call 'info', Time.now, 'app', 'hi'
|
40
|
+
assert_before log, 'hi', 'info'
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_removes_extra_new_lines_from_end_of_message
|
44
|
+
message = "!\n\n"
|
45
|
+
|
46
|
+
log = formatter.call 'info', Time.now, 'app', message
|
47
|
+
# strip here because all lines will have a new line.
|
48
|
+
assert_equal '!', log.strip[-1]
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def assert_before(string, second, first)
|
53
|
+
assert_includes string, first
|
54
|
+
assert_includes string, second
|
55
|
+
assert string.index(first) < string.index(second)
|
56
|
+
end
|
57
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logger-better
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ahawkins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -49,13 +49,18 @@ files:
|
|
49
49
|
- Gemfile
|
50
50
|
- LICENSE.txt
|
51
51
|
- README.md
|
52
|
+
- RELEASE_NOTES.md
|
52
53
|
- Rakefile
|
54
|
+
- circle.yml
|
53
55
|
- lib/logger-better.rb
|
54
|
-
- lib/logger-better/version.rb
|
55
56
|
- lib/logger/better.rb
|
57
|
+
- lib/logger/no_timestamp.rb
|
56
58
|
- lib/logger/null_logger.rb
|
57
59
|
- logger-better.gemspec
|
60
|
+
- test/better_patch_test.rb
|
58
61
|
- test/better_test.rb
|
62
|
+
- test/no_timestamp_patch_test.rb
|
63
|
+
- test/no_timestamp_test.rb
|
59
64
|
- test/null_logger_test.rb
|
60
65
|
- test/test_helper.rb
|
61
66
|
homepage: https://github.com/ahawkins/logger-better
|
@@ -83,6 +88,9 @@ signing_key:
|
|
83
88
|
specification_version: 4
|
84
89
|
summary: Simple monkey patch to stdlib's Logger to make it easier to use.
|
85
90
|
test_files:
|
91
|
+
- test/better_patch_test.rb
|
86
92
|
- test/better_test.rb
|
93
|
+
- test/no_timestamp_patch_test.rb
|
94
|
+
- test/no_timestamp_test.rb
|
87
95
|
- test/null_logger_test.rb
|
88
96
|
- test/test_helper.rb
|