yell 1.3.0 → 1.4.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 +7 -0
- data/.gitignore +3 -1
- data/.travis.yml +1 -2
- data/Gemfile +5 -1
- data/README.md +67 -14
- data/examples/004.1-colorizing-the-log-output.rb +4 -4
- data/lib/yell.rb +19 -10
- data/lib/yell/adapters.rb +23 -26
- data/lib/yell/adapters/base.rb +8 -2
- data/lib/yell/adapters/datefile.rb +45 -42
- data/lib/yell/adapters/file.rb +10 -5
- data/lib/yell/adapters/io.rb +52 -48
- data/lib/yell/adapters/streams.rb +10 -2
- data/lib/yell/configuration.rb +1 -1
- data/lib/yell/event.rb +4 -4
- data/lib/yell/formatter.rb +11 -25
- data/lib/yell/helpers/adapters.rb +51 -0
- data/lib/yell/helpers/base.rb +19 -0
- data/lib/yell/helpers/formatter.rb +31 -0
- data/lib/yell/helpers/level.rb +36 -0
- data/lib/yell/helpers/silencer.rb +32 -0
- data/lib/yell/helpers/tracer.rb +48 -0
- data/lib/yell/level.rb +38 -47
- data/lib/yell/logger.rb +53 -73
- data/lib/yell/repository.rb +31 -29
- data/lib/yell/silencer.rb +69 -0
- data/lib/yell/version.rb +1 -1
- data/spec/spec_helper.rb +21 -9
- data/spec/yell/adapters/base_spec.rb +17 -34
- data/spec/yell/adapters/datefile_spec.rb +109 -66
- data/spec/yell/adapters/file_spec.rb +18 -18
- data/spec/yell/adapters/io_spec.rb +17 -13
- data/spec/yell/adapters/streams_spec.rb +7 -7
- data/spec/yell/adapters_spec.rb +18 -23
- data/spec/yell/configuration_spec.rb +7 -7
- data/spec/yell/event_spec.rb +25 -27
- data/spec/yell/formatter_spec.rb +89 -82
- data/spec/yell/level_spec.rb +119 -94
- data/spec/yell/loggable_spec.rb +6 -5
- data/spec/yell/logger_spec.rb +106 -66
- data/spec/yell/repository_spec.rb +23 -38
- data/spec/yell/silencer_spec.rb +49 -0
- data/spec/yell_spec.rb +24 -27
- metadata +16 -9
data/lib/yell/adapters/file.rb
CHANGED
@@ -7,16 +7,21 @@ module Yell #:nodoc:
|
|
7
7
|
# for logging into files.
|
8
8
|
class File < Yell::Adapters::Io
|
9
9
|
|
10
|
-
|
10
|
+
private
|
11
|
+
|
12
|
+
# @overload setup!( options )
|
13
|
+
def setup!( options )
|
11
14
|
@filename = ::File.expand_path options.fetch(:filename, default_filename)
|
12
|
-
end
|
13
15
|
|
14
|
-
|
15
|
-
@stream = ::File.open( @filename, ::File::WRONLY|::File::APPEND|::File::CREAT )
|
16
|
+
super
|
16
17
|
end
|
17
18
|
|
19
|
+
# @overload open!
|
20
|
+
def open!
|
21
|
+
@stream = ::File.open( @filename, ::File::WRONLY|::File::APPEND|::File::CREAT )
|
18
22
|
|
19
|
-
|
23
|
+
super
|
24
|
+
end
|
20
25
|
|
21
26
|
def default_filename #:nodoc:
|
22
27
|
logdir = ::File.expand_path("log")
|
data/lib/yell/adapters/io.rb
CHANGED
@@ -4,57 +4,19 @@ module Yell #:nodoc:
|
|
4
4
|
module Adapters #:nodoc:
|
5
5
|
|
6
6
|
class Io < Yell::Adapters::Base
|
7
|
-
include Yell::Formatter
|
7
|
+
include Yell::Helpers::Formatter
|
8
8
|
|
9
9
|
# The possible unix log colors
|
10
|
-
|
11
|
-
0 => "\
|
12
|
-
|
13
|
-
2 => "\
|
14
|
-
3 => "\
|
15
|
-
4 => "\
|
16
|
-
5 => "\
|
17
|
-
-1 => "\
|
10
|
+
TTYColors = {
|
11
|
+
0 => "\033[1;32m", # green
|
12
|
+
1 => "\033[0m", # normal
|
13
|
+
2 => "\033[1;33m", # yellow
|
14
|
+
3 => "\033[1;31m", # red
|
15
|
+
4 => "\033[1;35m", # magenta
|
16
|
+
5 => "\033[1;36m", # cyan
|
17
|
+
-1 => "\033[0m" # normal
|
18
18
|
}
|
19
19
|
|
20
|
-
setup do |options|
|
21
|
-
@stream = nil
|
22
|
-
|
23
|
-
# colorize the log output (default: false)
|
24
|
-
self.colors = options.fetch(:colors, false)
|
25
|
-
|
26
|
-
# format the log message (default: nil)
|
27
|
-
self.format = options.fetch(:format, nil)
|
28
|
-
|
29
|
-
# sync immediately to IO (default: true)
|
30
|
-
self.sync = options.fetch(:sync, true)
|
31
|
-
end
|
32
|
-
|
33
|
-
write do |event|
|
34
|
-
message = format.format(event)
|
35
|
-
|
36
|
-
# colorize if applicable
|
37
|
-
if colors and color = Colors[event.level]
|
38
|
-
message = color + message + Colors[-1]
|
39
|
-
end
|
40
|
-
|
41
|
-
# add new line if there is none
|
42
|
-
message << "\n" unless message[-1] == ?\n
|
43
|
-
|
44
|
-
stream.syswrite( message )
|
45
|
-
end
|
46
|
-
|
47
|
-
open do
|
48
|
-
@stream.sync = self.sync if @stream.respond_to? :sync
|
49
|
-
@stream.flush if @stream.respond_to? :flush
|
50
|
-
end
|
51
|
-
|
52
|
-
close do
|
53
|
-
@stream.close if @stream.respond_to? :close
|
54
|
-
@stream = nil
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
20
|
# Sets the “sync mode” to true or false.
|
59
21
|
#
|
60
22
|
# When true (default), every log event is immediately written to the file.
|
@@ -79,6 +41,48 @@ module Yell #:nodoc:
|
|
79
41
|
|
80
42
|
private
|
81
43
|
|
44
|
+
# @overload setup!( options )
|
45
|
+
def setup!( options )
|
46
|
+
@stream = nil
|
47
|
+
|
48
|
+
self.colors = options.fetch(:colors, false)
|
49
|
+
self.format = options.fetch(:format, nil)
|
50
|
+
self.sync = options.fetch(:sync, true)
|
51
|
+
|
52
|
+
super
|
53
|
+
end
|
54
|
+
|
55
|
+
# @overload write!( event )
|
56
|
+
def write!( event )
|
57
|
+
message = format.format(event)
|
58
|
+
|
59
|
+
# colorize if applicable
|
60
|
+
if colors and color = TTYColors[event.level]
|
61
|
+
message = color + message + TTYColors[-1]
|
62
|
+
end
|
63
|
+
|
64
|
+
message << "\n" unless message[-1] == ?\n
|
65
|
+
stream.syswrite( message )
|
66
|
+
|
67
|
+
super
|
68
|
+
end
|
69
|
+
|
70
|
+
# @overload open!
|
71
|
+
def open!
|
72
|
+
@stream.sync = self.sync if @stream.respond_to? :sync
|
73
|
+
@stream.flush if @stream.respond_to? :flush
|
74
|
+
|
75
|
+
super
|
76
|
+
end
|
77
|
+
|
78
|
+
# @overload close!
|
79
|
+
def close!
|
80
|
+
@stream.close if @stream.respond_to? :close
|
81
|
+
@stream = nil
|
82
|
+
|
83
|
+
super
|
84
|
+
end
|
85
|
+
|
82
86
|
# The IO stream
|
83
87
|
#
|
84
88
|
# Adapter classes should provide their own implementation
|
@@ -87,7 +91,7 @@ module Yell #:nodoc:
|
|
87
91
|
synchronize { open! if @stream.nil?; @stream }
|
88
92
|
end
|
89
93
|
|
90
|
-
# @
|
94
|
+
# @overload inspectables
|
91
95
|
def inspectables
|
92
96
|
super.concat [:format, :colors, :sync]
|
93
97
|
end
|
@@ -5,16 +5,24 @@ module Yell #:nodoc:
|
|
5
5
|
|
6
6
|
class Stdout < Yell::Adapters::Io
|
7
7
|
|
8
|
-
|
8
|
+
private
|
9
|
+
|
10
|
+
# @overload open!
|
11
|
+
def open!
|
9
12
|
@stream = $stdout.clone
|
13
|
+
super
|
10
14
|
end
|
11
15
|
|
12
16
|
end
|
13
17
|
|
14
18
|
class Stderr < Yell::Adapters::Io
|
15
19
|
|
16
|
-
|
20
|
+
private
|
21
|
+
|
22
|
+
# @overload open!
|
23
|
+
def open!
|
17
24
|
@stream = $stderr.clone
|
25
|
+
super
|
18
26
|
end
|
19
27
|
|
20
28
|
end
|
data/lib/yell/configuration.rb
CHANGED
@@ -13,7 +13,7 @@ module Yell #:nodoc:
|
|
13
13
|
yaml = YAML.load( ERB.new(File.read(file)).result )
|
14
14
|
|
15
15
|
# in case we have ActiveSupport
|
16
|
-
if yaml.respond_to?(
|
16
|
+
if yaml.respond_to?(:with_indifference_access)
|
17
17
|
yaml = yaml.with_indifferent_access
|
18
18
|
end
|
19
19
|
|
data/lib/yell/event.rb
CHANGED
@@ -65,23 +65,23 @@ module Yell #:nodoc:
|
|
65
65
|
|
66
66
|
# Accessor to filename the log event occured
|
67
67
|
def file
|
68
|
-
@file || (
|
68
|
+
@file || (backtrace!; @file)
|
69
69
|
end
|
70
70
|
|
71
71
|
# Accessor to the line the log event occured
|
72
72
|
def line
|
73
|
-
@line || (
|
73
|
+
@line || (backtrace!; @line)
|
74
74
|
end
|
75
75
|
|
76
76
|
# Accessor to the method the log event occured
|
77
77
|
def method
|
78
|
-
@method || (
|
78
|
+
@method || (backtrace!; @method)
|
79
79
|
end
|
80
80
|
|
81
81
|
|
82
82
|
private
|
83
83
|
|
84
|
-
def
|
84
|
+
def backtrace!
|
85
85
|
if m = CallerRegexp.match(@caller)
|
86
86
|
@file, @line, @method = m[1..-1]
|
87
87
|
else
|
data/lib/yell/formatter.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require 'time'
|
4
3
|
|
5
4
|
module Yell #:nodoc:
|
@@ -46,21 +45,8 @@ module Yell #:nodoc:
|
|
46
45
|
|
47
46
|
# The +Formatter+ provides a handle to configure your log message style.
|
48
47
|
class Formatter
|
49
|
-
module Helpers
|
50
|
-
# Accessor to the format
|
51
|
-
attr_reader :format
|
52
|
-
|
53
|
-
# Set the format for your message.
|
54
|
-
def format=( pattern )
|
55
|
-
@format = case pattern
|
56
|
-
when Yell::Formatter then pattern
|
57
|
-
when false then Yell::Formatter.new( Yell::NoFormat )
|
58
|
-
else Yell::Formatter.new( *pattern )
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
48
|
|
63
|
-
|
49
|
+
Table = {
|
64
50
|
"m" => "message(*event.messages)", # Message
|
65
51
|
"l" => "level(event.level)[0,1]", # Level (short), e.g.'I', 'W'
|
66
52
|
"L" => "level(event.level)", # Level, e.g. 'INFO', 'WARN'
|
@@ -75,7 +61,7 @@ module Yell #:nodoc:
|
|
75
61
|
"n" => "event.line" # Line where the logger was called
|
76
62
|
}
|
77
63
|
|
78
|
-
|
64
|
+
Matcher = /([^%]*)(%\d*)?(#{Table.keys.join('|')})?(.*)/
|
79
65
|
|
80
66
|
|
81
67
|
# Initializes a new +Yell::Formatter+.
|
@@ -91,7 +77,7 @@ module Yell #:nodoc:
|
|
91
77
|
define_format_method!
|
92
78
|
end
|
93
79
|
|
94
|
-
# Get a pretty string
|
80
|
+
# Get a pretty string
|
95
81
|
def inspect
|
96
82
|
"#<#{self.class.name} pattern: #{@pattern.inspect}, date_pattern: #{@date_pattern.inspect}>"
|
97
83
|
end
|
@@ -117,26 +103,27 @@ module Yell #:nodoc:
|
|
117
103
|
buff, args, _pattern = "", [], @pattern.dup
|
118
104
|
|
119
105
|
while true
|
120
|
-
match =
|
106
|
+
match = Matcher.match(_pattern)
|
121
107
|
|
122
108
|
buff << match[1] unless match[1].empty?
|
123
109
|
break if match[2].nil?
|
124
110
|
|
125
111
|
buff << match[2] + 's'
|
126
|
-
args <<
|
112
|
+
args << Table[ match[3] ]
|
127
113
|
|
128
114
|
_pattern = match[4]
|
129
115
|
end
|
130
116
|
|
131
|
-
instance_eval
|
117
|
+
instance_eval <<-EOS, __FILE__, __LINE__
|
132
118
|
def format( event )
|
133
|
-
sprintf(
|
119
|
+
sprintf("#{buff}", #{args.join(',')})
|
134
120
|
end
|
135
|
-
|
121
|
+
EOS
|
136
122
|
end
|
137
123
|
|
138
124
|
# The iso8601 implementation of the standard Time library is more than
|
139
|
-
# twice as slow
|
125
|
+
# twice as slow compared to using strftime. So, we just implement
|
126
|
+
# it ourselves --R
|
140
127
|
def iso8601( t )
|
141
128
|
zone = if t.utc?
|
142
129
|
"-00:00"
|
@@ -163,8 +150,7 @@ module Yell #:nodoc:
|
|
163
150
|
m.map { |k,v| "#{k}: #{v}" }.join( ", " )
|
164
151
|
when Exception
|
165
152
|
backtrace = m.backtrace ? "\n\t#{m.backtrace.join("\n\t")}" : ""
|
166
|
-
|
167
|
-
"%s: %s%s" % [m.class, m.message, backtrace]
|
153
|
+
sprintf("%s: %s%s", m.class, m.message, backtrace)
|
168
154
|
else
|
169
155
|
m
|
170
156
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Yell #:nodoc:
|
3
|
+
module Helpers #:nodoc:
|
4
|
+
module Adapters #:nodoc:
|
5
|
+
|
6
|
+
# Define an adapter to be used for logging.
|
7
|
+
#
|
8
|
+
# @example Standard adapter
|
9
|
+
# adapter :file
|
10
|
+
#
|
11
|
+
# @example Standard adapter with filename
|
12
|
+
# adapter :file, 'development.log'
|
13
|
+
#
|
14
|
+
# # Alternative notation for filename in options
|
15
|
+
# adapter :file, :filename => 'developent.log'
|
16
|
+
#
|
17
|
+
# @example Standard adapter with filename and additional options
|
18
|
+
# adapter :file, 'development.log', :level => :warn
|
19
|
+
#
|
20
|
+
# @example Set the adapter directly from an adapter instance
|
21
|
+
# adapter( Yell::Adapter::File.new )
|
22
|
+
#
|
23
|
+
# @param [Symbol] type The type of the adapter, may be `:file` or `:datefile` (default `:file`)
|
24
|
+
# @return [Yell::Adapter] The instance
|
25
|
+
# @raise [Yell::NoSuchAdapter] Will be thrown when the adapter is not defined
|
26
|
+
def adapter( type = :file, *args, &block )
|
27
|
+
options = [@options, *args].inject( Hash.new ) do |h, c|
|
28
|
+
h.merge( [String, Pathname].include?(c.class) ? {:filename => c} : c )
|
29
|
+
end
|
30
|
+
|
31
|
+
@adapters << Yell::Adapters.new(type, options, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @private
|
35
|
+
def adapters
|
36
|
+
@adapters
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def reset!
|
43
|
+
@adapters = []
|
44
|
+
|
45
|
+
super
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Yell #:nodoc:
|
3
|
+
module Helpers #:nodoc:
|
4
|
+
module Formatter #:nodoc:
|
5
|
+
|
6
|
+
# Set the format for your message.
|
7
|
+
def format=( pattern )
|
8
|
+
@formatter = case pattern
|
9
|
+
when Yell::Formatter then pattern
|
10
|
+
when false then Yell::Formatter.new(Yell::NoFormat)
|
11
|
+
else Yell::Formatter.new(*pattern)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# @private
|
16
|
+
def format
|
17
|
+
@formatter
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def reset!
|
23
|
+
@formatter = Yell::Formatter.new
|
24
|
+
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Yell #:nodoc:
|
3
|
+
module Helpers #:nodoc:
|
4
|
+
module Level
|
5
|
+
|
6
|
+
# Set the minimum log level.
|
7
|
+
#
|
8
|
+
# @example Set the level to :warn
|
9
|
+
# level = :warn
|
10
|
+
#
|
11
|
+
# @param [String, Symbol, Integer] severity The minimum log level
|
12
|
+
def level=( severity )
|
13
|
+
@level.set(severity)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @private
|
17
|
+
def level
|
18
|
+
@level
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def reset!
|
24
|
+
@level = Yell::Level.new
|
25
|
+
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def inspectables
|
30
|
+
[:level] | super
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|