tagged_logger 0.2.1 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CHANGES.markdown +13 -0
- data/VERSION +1 -1
- data/lib/tagged_logger.rb +40 -25
- data/tagged_logger.gemspec +3 -2
- data/test/test.rb +12 -5
- data/todo.txt +21 -1
- metadata +3 -2
data/.gitignore
CHANGED
data/CHANGES.markdown
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# tagged_logger changelog
|
2
|
+
|
3
|
+
## Version 0.2.5
|
4
|
+
|
5
|
+
* If somebody is not ready to define any logging rules, but still want to use #logger everywhere, use new _init()_ method:
|
6
|
+
|
7
|
+
_TaggedLogger.init_
|
8
|
+
|
9
|
+
* Runs about 3 times faster by executing code responsible for rule matching to the first _#logger()_ call and "precompiling" it.
|
10
|
+
So rather than iterating over **all** rules on every _#logger_ call only subset of rules specific to _#logger()_ callee are executed.
|
11
|
+
|
12
|
+
* Code simplified
|
13
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.5
|
data/lib/tagged_logger.rb
CHANGED
@@ -2,30 +2,32 @@ require 'delegate'
|
|
2
2
|
require 'facets/dictionary'
|
3
3
|
|
4
4
|
class TaggedLogger
|
5
|
-
@logger_generator_exists = false
|
6
5
|
@rename_rules = Dictionary.new
|
7
6
|
@tag_blocks = Dictionary.new
|
8
|
-
|
7
|
+
|
9
8
|
class << self
|
10
9
|
def reset
|
11
10
|
@rename_rules = Dictionary.new
|
12
11
|
@tag_blocks = Dictionary.new
|
12
|
+
ObjectSpace.each_object(ClassSpecificLogger) { |obj| obj.detach }
|
13
13
|
end
|
14
14
|
|
15
15
|
def rules(&block)
|
16
16
|
instance_eval(&block)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def blocks_for(tag)
|
20
|
+
blocks = []
|
20
21
|
tag_aliases(tag) do |tag_alias|
|
21
22
|
tag_blocks(tag_alias) do |tag_block|
|
22
|
-
|
23
|
+
blocks << [tag_alias, tag_block]
|
23
24
|
end
|
24
25
|
end
|
26
|
+
blocks
|
25
27
|
end
|
26
28
|
|
27
29
|
def init
|
28
|
-
|
30
|
+
add_logger_generator_in_Kernel
|
29
31
|
end
|
30
32
|
|
31
33
|
def output_everything_to(logger = nil, &block)
|
@@ -37,7 +39,7 @@ class TaggedLogger
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def output(spec, &block)
|
40
|
-
|
42
|
+
add_logger_generator_in_Kernel
|
41
43
|
if spec.is_a? Hash
|
42
44
|
spec.each do |what, where|
|
43
45
|
@tag_blocks[tag_matcher(what)] = lambda { |level, tag, msg | where.send(level, "#{tag}: #{msg}\n") }
|
@@ -96,30 +98,43 @@ class TaggedLogger
|
|
96
98
|
end
|
97
99
|
end
|
98
100
|
|
99
|
-
def
|
100
|
-
return if
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
return class_logger if class_logger
|
108
|
-
@class_logger = SimpleDelegator.new(TaggedLogger)
|
109
|
-
class_logging_tag = self.class == Class ? self.to_s : self.class.to_s
|
110
|
-
[:debug, :warn, :info, :error, :fatal].each do |method|
|
111
|
-
(class << @class_logger;self;end).instance_eval do
|
112
|
-
define_method method do |msg|
|
113
|
-
__getobj__.log(method, class_logging_tag, msg)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
101
|
+
def add_logger_generator_in_Kernel
|
102
|
+
return if Kernel.respond_to?(:logger, true) #no harm
|
103
|
+
Kernel.class_eval do
|
104
|
+
def logger
|
105
|
+
klass = self.class == Class ? self : self.class
|
106
|
+
result = klass.class_eval do
|
107
|
+
return @class_logger if @class_logger
|
108
|
+
@class_logger = ClassSpecificLogger.new(klass)
|
117
109
|
@class_logger
|
118
110
|
end
|
111
|
+
result
|
119
112
|
end
|
120
|
-
logger
|
121
113
|
end
|
122
114
|
end
|
123
115
|
|
124
116
|
end # class methods
|
117
|
+
|
118
|
+
class ClassSpecificLogger
|
119
|
+
def eigenclass
|
120
|
+
class <<self; self; end
|
121
|
+
end
|
122
|
+
|
123
|
+
def initialize(klass)
|
124
|
+
@klass = klass
|
125
|
+
blocks = TaggedLogger.blocks_for(klass.to_s)
|
126
|
+
[:debug, :warn, :info, :error, :fatal].each do |method|
|
127
|
+
eigenclass.send(:define_method, method) do |msg|
|
128
|
+
blocks.each { |(tag_alias, block)| block.call(method, tag_alias, msg) }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def detach
|
134
|
+
@klass.class_eval do
|
135
|
+
@class_logger = nil
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
125
140
|
end
|
data/tagged_logger.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{tagged_logger}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Fedor Kocherga"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-13}
|
13
13
|
s.email = %q{fkocherga@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.html",
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".gitignore",
|
20
|
+
"CHANGES.markdown",
|
20
21
|
"MIT-LICENSE",
|
21
22
|
"README.markdown",
|
22
23
|
"Rakefile",
|
data/test/test.rb
CHANGED
@@ -18,7 +18,8 @@ end
|
|
18
18
|
class TaggedLoggerTest < Test::Unit::TestCase
|
19
19
|
include RR::Adapters::TestUnit
|
20
20
|
|
21
|
-
|
21
|
+
|
22
|
+
context "@standard_logger with stub output @out1;" do
|
22
23
|
setup do
|
23
24
|
@out1 = TestLogDevice.new
|
24
25
|
@standard_logger = Logger.new(@out1)
|
@@ -26,6 +27,12 @@ class TaggedLoggerTest < Test::Unit::TestCase
|
|
26
27
|
@standard_logger.formatter = @formatter
|
27
28
|
end
|
28
29
|
|
30
|
+
teardown do
|
31
|
+
Kernel.class_eval do
|
32
|
+
remove_method :logger
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
29
36
|
should "be able to intialize with minimal effort" do
|
30
37
|
TaggedLogger.init
|
31
38
|
dont_allow(@out1).write
|
@@ -33,7 +40,7 @@ class TaggedLoggerTest < Test::Unit::TestCase
|
|
33
40
|
assert_nothing_raised { Class.new.logger }
|
34
41
|
end
|
35
42
|
|
36
|
-
context "
|
43
|
+
context "everything gets logged to @out1;" do
|
37
44
|
setup do
|
38
45
|
logger = @standard_logger
|
39
46
|
TaggedLogger.rules do
|
@@ -42,7 +49,7 @@ class TaggedLoggerTest < Test::Unit::TestCase
|
|
42
49
|
end
|
43
50
|
end
|
44
51
|
|
45
|
-
should "
|
52
|
+
should " be possible to log by .logger.debug/info/warn/error/fatal()" do
|
46
53
|
NewClass = Class.new
|
47
54
|
obj = NewClass.new
|
48
55
|
%w[debug info warn error fatal].each do |method|
|
@@ -78,14 +85,14 @@ class TaggedLoggerTest < Test::Unit::TestCase
|
|
78
85
|
assert_equal "TEST: foo\n", @out1.to_s
|
79
86
|
end
|
80
87
|
|
81
|
-
context "
|
88
|
+
context "@logger2 with stub output @out2;" do
|
82
89
|
setup do
|
83
90
|
@out2 = TestLogDevice.new
|
84
91
|
@logger2 = Logger.new(@out2)
|
85
92
|
@logger2.formatter = @formatter
|
86
93
|
end
|
87
94
|
|
88
|
-
should "be possible to speialize logging for tag A by specifying
|
95
|
+
should "be possible to speialize logging for tag A by specifying another @logger2" do
|
89
96
|
logger2 = @logger2
|
90
97
|
TaggedLogger.rules do
|
91
98
|
output A => logger2
|
data/todo.txt
CHANGED
@@ -1 +1,21 @@
|
|
1
|
-
|
1
|
+
- It is slow: logger on first call has to select only applicable rules and
|
2
|
+
run only them afterwards rather than going via all rules each time. It will
|
3
|
+
gain almost 300% in parsing speed on my app.
|
4
|
+
|
5
|
+
- Replace output ... => ... with
|
6
|
+
format ...
|
7
|
+
output ... => do
|
8
|
+
format ....
|
9
|
+
end
|
10
|
+
|
11
|
+
- output ... => ... - may be:
|
12
|
+
debug ... => ...
|
13
|
+
info ... => ...
|
14
|
+
|
15
|
+
- Simplest configuration with warning
|
16
|
+
|
17
|
+
- Switch tests on rr expectations
|
18
|
+
|
19
|
+
- logger called within Base does not log when Derived is instantiated
|
20
|
+
|
21
|
+
- writing messages in any encoding
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tagged_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fedor Kocherga
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-13 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,6 +24,7 @@ extra_rdoc_files:
|
|
24
24
|
- README.markdown
|
25
25
|
files:
|
26
26
|
- .gitignore
|
27
|
+
- CHANGES.markdown
|
27
28
|
- MIT-LICENSE
|
28
29
|
- README.markdown
|
29
30
|
- Rakefile
|