buffered-logger 1.0.1 → 1.0.3
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/lib/buffered-logger.rb +1 -0
- data/lib/buffered_logger/log_device_proxy.rb +19 -4
- data/lib/buffered_logger/rails.rb +2 -0
- data/lib/buffered_logger/version.rb +1 -1
- data/lib/buffered_logger.rb +9 -0
- data/test/buffered_logger/log_device_proxy_test.rb +35 -1
- data/test/buffered_logger/middleware_test.rb +1 -1
- data/test/buffered_logger_test.rb +10 -65
- metadata +25 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "buffered_logger"
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require "fiber"
|
|
2
|
+
require "thread"
|
|
3
|
+
|
|
1
4
|
class BufferedLogger
|
|
2
5
|
class LogDeviceProxy
|
|
3
6
|
def initialize(logdev)
|
|
@@ -10,23 +13,35 @@ class BufferedLogger
|
|
|
10
13
|
end
|
|
11
14
|
|
|
12
15
|
def end
|
|
13
|
-
@logdev.write(@buffers.delete(
|
|
16
|
+
@logdev.write(@buffers.delete(key).string)
|
|
14
17
|
end
|
|
15
18
|
|
|
16
19
|
def start
|
|
17
|
-
@buffers[
|
|
20
|
+
@buffers[key] = StringIO.new
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
def started?
|
|
21
|
-
@buffers.key?(
|
|
24
|
+
@buffers.key?(key)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def sweep
|
|
28
|
+
@buffers.keep_if do |key, buffer|
|
|
29
|
+
key.all?(&:alive?)
|
|
30
|
+
end
|
|
31
|
+
true
|
|
22
32
|
end
|
|
23
33
|
|
|
24
34
|
def write(message)
|
|
25
35
|
if started?
|
|
26
|
-
@buffers[
|
|
36
|
+
@buffers[key].write(message)
|
|
27
37
|
else
|
|
28
38
|
@logdev.write(message)
|
|
29
39
|
end
|
|
30
40
|
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
def key
|
|
44
|
+
[Thread.current, Fiber.current]
|
|
45
|
+
end
|
|
31
46
|
end
|
|
32
47
|
end
|
data/lib/buffered_logger.rb
CHANGED
|
@@ -6,14 +6,19 @@ class BufferedLogger < Logger
|
|
|
6
6
|
require "buffered_logger/middleware"
|
|
7
7
|
require "buffered_logger/version"
|
|
8
8
|
|
|
9
|
+
attr_accessor :sweep_frequency
|
|
10
|
+
|
|
9
11
|
def initialize(*)
|
|
10
12
|
super
|
|
11
13
|
@logdev = LogDeviceProxy.new(@logdev)
|
|
14
|
+
self.sweep_frequency = 0.02
|
|
12
15
|
end
|
|
13
16
|
|
|
14
17
|
def end
|
|
15
18
|
raise NotStartedError, "not started" unless started?
|
|
16
19
|
@logdev.end
|
|
20
|
+
sweep if rand <= sweep_frequency
|
|
21
|
+
nil
|
|
17
22
|
end
|
|
18
23
|
|
|
19
24
|
def start(&block)
|
|
@@ -34,4 +39,8 @@ class BufferedLogger < Logger
|
|
|
34
39
|
def started?
|
|
35
40
|
@logdev.started?
|
|
36
41
|
end
|
|
42
|
+
|
|
43
|
+
def sweep
|
|
44
|
+
@logdev.sweep
|
|
45
|
+
end
|
|
37
46
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require "test_helper"
|
|
2
2
|
|
|
3
3
|
describe BufferedLogger::LogDeviceProxy do
|
|
4
|
-
|
|
4
|
+
before do
|
|
5
5
|
@logdev = mock()
|
|
6
6
|
@proxy = BufferedLogger::LogDeviceProxy.new(@logdev)
|
|
7
7
|
end
|
|
@@ -42,4 +42,38 @@ describe BufferedLogger::LogDeviceProxy do
|
|
|
42
42
|
@proxy.write("3")
|
|
43
43
|
@proxy.end
|
|
44
44
|
end
|
|
45
|
+
|
|
46
|
+
describe "sweep" do
|
|
47
|
+
it "should check if the thread and fiber are alive" do
|
|
48
|
+
fiber = mock()
|
|
49
|
+
fiber.expects(:alive?).returns(true)
|
|
50
|
+
thread = mock()
|
|
51
|
+
thread.expects(:alive?).returns(true)
|
|
52
|
+
Fiber.stubs(:current).returns(fiber)
|
|
53
|
+
Thread.stubs(:current).returns(thread)
|
|
54
|
+
|
|
55
|
+
@proxy.start
|
|
56
|
+
@proxy.sweep
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should remove dead threads or fibers" do
|
|
60
|
+
fiber = mock()
|
|
61
|
+
fiber.stubs(:alive?).returns(false)
|
|
62
|
+
thread = mock()
|
|
63
|
+
thread.stubs(:alive?).returns(true)
|
|
64
|
+
Fiber.stubs(:current).returns(fiber)
|
|
65
|
+
Thread.stubs(:current).returns(thread)
|
|
66
|
+
|
|
67
|
+
@proxy.start
|
|
68
|
+
@proxy.sweep
|
|
69
|
+
assert !@proxy.started?
|
|
70
|
+
|
|
71
|
+
fiber.stubs(:alive?).returns(true)
|
|
72
|
+
thread.stubs(:alive?).returns(false)
|
|
73
|
+
|
|
74
|
+
@proxy.start
|
|
75
|
+
@proxy.sweep
|
|
76
|
+
assert !@proxy.started?
|
|
77
|
+
end
|
|
78
|
+
end
|
|
45
79
|
end
|
|
@@ -1,73 +1,18 @@
|
|
|
1
1
|
require "test_helper"
|
|
2
2
|
|
|
3
|
-
class MockLogDeviceProxy
|
|
4
|
-
def initialize
|
|
5
|
-
@started = false
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def end
|
|
9
|
-
@started = false
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def start
|
|
13
|
-
@started = true
|
|
14
|
-
|
|
15
|
-
if block_given?
|
|
16
|
-
begin
|
|
17
|
-
yield
|
|
18
|
-
ensure
|
|
19
|
-
@started = false
|
|
20
|
-
end
|
|
21
|
-
else
|
|
22
|
-
true
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def started?
|
|
27
|
-
@started
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
3
|
describe BufferedLogger do
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@logger = BufferedLogger.allocate
|
|
36
|
-
@logger.instance_variable_set(:@logdev, @logdev)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should raise an error if end is called while not started" do
|
|
40
|
-
-> { @logger.end }.must_raise(BufferedLogger::NotStartedError)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "should raise an error if start is called while already started" do
|
|
44
|
-
@logger.start
|
|
45
|
-
-> { @logger.start }.must_raise(BufferedLogger::AlreadyStartedError)
|
|
46
|
-
end
|
|
4
|
+
before do
|
|
5
|
+
@buffer = StringIO.new
|
|
6
|
+
@logger = BufferedLogger.new(@buffer)
|
|
47
7
|
end
|
|
48
8
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
@logger.instance_variable_set(:@logdev, @logdev)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "should call end on logdev" do
|
|
57
|
-
@logdev.expects(:end)
|
|
58
|
-
@logdev.stubs(:started?).returns(true)
|
|
59
|
-
@logger.end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should call start on logdev" do
|
|
63
|
-
@logdev.expects(:start)
|
|
64
|
-
@logdev.stubs(:started?).returns(false)
|
|
65
|
-
@logger.start
|
|
66
|
-
end
|
|
9
|
+
it "should raise an error if end is called while not started" do
|
|
10
|
+
@logger.stubs(:started?).returns(false)
|
|
11
|
+
-> { @logger.end }.must_raise(BufferedLogger::NotStartedError)
|
|
12
|
+
end
|
|
67
13
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
end
|
|
14
|
+
it "should raise an error if start is called while already started" do
|
|
15
|
+
@logger.stubs(:started?).returns(true)
|
|
16
|
+
-> { @logger.start }.must_raise(BufferedLogger::AlreadyStartedError)
|
|
72
17
|
end
|
|
73
18
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: buffered-logger
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.3
|
|
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-
|
|
12
|
+
date: 2012-09-13 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -43,15 +43,33 @@ dependencies:
|
|
|
43
43
|
- - ~>
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
45
|
version: 0.12.1
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: rake
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
none: false
|
|
50
|
+
requirements:
|
|
51
|
+
- - ~>
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 0.9.2.2
|
|
54
|
+
type: :development
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ~>
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.9.2.2
|
|
46
62
|
description: buffered-logger is designed to be used in multithreaded or multifiber
|
|
47
63
|
rack servers and includes a middleware to automatically capture and write the buffered
|
|
48
|
-
log statements during each request.
|
|
64
|
+
log statements during each request. This is ideal for keeping requests together
|
|
65
|
+
for log parsing software such as splunk.
|
|
49
66
|
email:
|
|
50
67
|
- samuel@kadolph.com
|
|
51
68
|
executables: []
|
|
52
69
|
extensions: []
|
|
53
70
|
extra_rdoc_files: []
|
|
54
71
|
files:
|
|
72
|
+
- lib/buffered-logger.rb
|
|
55
73
|
- lib/buffered_logger/errors.rb
|
|
56
74
|
- lib/buffered_logger/log_device_proxy.rb
|
|
57
75
|
- lib/buffered_logger/middleware.rb
|
|
@@ -61,7 +79,7 @@ files:
|
|
|
61
79
|
- test/buffered_logger/log_device_proxy_test.rb
|
|
62
80
|
- test/buffered_logger/middleware_test.rb
|
|
63
81
|
- test/buffered_logger_test.rb
|
|
64
|
-
homepage: http://samuelkadolph.github.com/buffered-logger
|
|
82
|
+
homepage: http://samuelkadolph.github.com/buffered-logger/
|
|
65
83
|
licenses: []
|
|
66
84
|
post_install_message:
|
|
67
85
|
rdoc_options: []
|
|
@@ -79,6 +97,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
79
97
|
- - ! '>='
|
|
80
98
|
- !ruby/object:Gem::Version
|
|
81
99
|
version: '0'
|
|
100
|
+
segments:
|
|
101
|
+
- 0
|
|
102
|
+
hash: -4164329227286823288
|
|
82
103
|
requirements: []
|
|
83
104
|
rubyforge_project:
|
|
84
105
|
rubygems_version: 1.8.24
|
|
@@ -90,4 +111,3 @@ test_files:
|
|
|
90
111
|
- test/buffered_logger/log_device_proxy_test.rb
|
|
91
112
|
- test/buffered_logger/middleware_test.rb
|
|
92
113
|
- test/buffered_logger_test.rb
|
|
93
|
-
has_rdoc:
|