buffered-logger 1.2.2 → 2.0.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/lib/buffered_logger.rb +0 -8
- data/lib/buffered_logger/log_device_proxy.rb +22 -18
- data/lib/buffered_logger/version.rb +1 -1
- data/test/buffered_logger/log_device_proxy_slow_test.rb +28 -0
- data/test/buffered_logger/log_device_proxy_test.rb +0 -27
- data/test/buffered_logger_slow_test.rb +23 -0
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b22772662c4a00e7c497ccde9cfa8be61cd66c6
|
4
|
+
data.tar.gz: 00658ed94b4dcdf3d318eaca0eb53c6e3306510c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a4f915cde421f9af0b57ad267270c980938b16f576421e516221e0e41dd60fec63539895efce09d926590d3b1abf5acd40d18612ef29b6cf65e7e192428830e
|
7
|
+
data.tar.gz: 8d08829ec1ff7ce51733142f03b544433450a88cd9f1f81cba8d289cbb65e4aeaf4cffc8fb82e3350822767152a3466851e19bc2b5dd2c3653b186ed5abae275
|
data/lib/buffered_logger.rb
CHANGED
@@ -6,18 +6,14 @@ class BufferedLogger < ::Logger
|
|
6
6
|
require "buffered_logger/middleware"
|
7
7
|
require "buffered_logger/version"
|
8
8
|
|
9
|
-
attr_accessor :sweep_frequency
|
10
|
-
|
11
9
|
def initialize(*)
|
12
10
|
super
|
13
11
|
@logdev = LogDeviceProxy.new(@logdev)
|
14
|
-
self.sweep_frequency = 0.02
|
15
12
|
end
|
16
13
|
|
17
14
|
def end
|
18
15
|
raise NotStartedError, "not started" unless started?
|
19
16
|
@logdev.end
|
20
|
-
sweep if rand <= sweep_frequency
|
21
17
|
nil
|
22
18
|
end
|
23
19
|
|
@@ -44,10 +40,6 @@ class BufferedLogger < ::Logger
|
|
44
40
|
@logdev.started?
|
45
41
|
end
|
46
42
|
|
47
|
-
def sweep
|
48
|
-
@logdev.sweep
|
49
|
-
end
|
50
|
-
|
51
43
|
def current_log
|
52
44
|
@logdev.current_log
|
53
45
|
end
|
@@ -2,9 +2,11 @@ require "thread"
|
|
2
2
|
|
3
3
|
class BufferedLogger
|
4
4
|
class LogDeviceProxy
|
5
|
+
THREAD_LOCAL_VAR_NAME = :"BufferedLogger::LogDeviceProxy::string_io"
|
6
|
+
|
5
7
|
def initialize(logdev)
|
6
8
|
@logdev = logdev
|
7
|
-
|
9
|
+
destroy_thread_local
|
8
10
|
end
|
9
11
|
|
10
12
|
def close
|
@@ -12,44 +14,46 @@ class BufferedLogger
|
|
12
14
|
end
|
13
15
|
|
14
16
|
def end
|
15
|
-
@logdev.write(
|
17
|
+
@logdev.write(string_io.string)
|
18
|
+
destroy_thread_local
|
16
19
|
end
|
17
20
|
|
18
21
|
def flush
|
19
|
-
|
20
|
-
|
22
|
+
@logdev.write(string_io.string)
|
23
|
+
string_io.string.clear
|
21
24
|
end
|
22
25
|
|
23
26
|
def start
|
24
|
-
|
27
|
+
self.string_io = StringIO.new
|
25
28
|
end
|
26
29
|
|
27
30
|
def started?
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def sweep
|
32
|
-
@buffers.clone.each do |key, buffer|
|
33
|
-
@buffers.delete(key) unless key.all?(&:alive?)
|
34
|
-
end
|
35
|
-
true
|
31
|
+
!!string_io
|
36
32
|
end
|
37
33
|
|
38
34
|
def write(message)
|
39
35
|
if started?
|
40
|
-
|
36
|
+
string_io.write(message)
|
41
37
|
else
|
42
38
|
@logdev.write(message)
|
43
39
|
end
|
44
40
|
end
|
45
41
|
|
46
42
|
def current_log
|
47
|
-
|
43
|
+
string_io.string.dup
|
48
44
|
end
|
49
45
|
|
50
46
|
private
|
51
|
-
|
52
|
-
|
53
|
-
|
47
|
+
def string_io
|
48
|
+
Thread.current.thread_variable_get(THREAD_LOCAL_VAR_NAME)
|
49
|
+
end
|
50
|
+
|
51
|
+
def string_io=(string_io)
|
52
|
+
Thread.current.thread_variable_set(THREAD_LOCAL_VAR_NAME,string_io)
|
53
|
+
end
|
54
|
+
|
55
|
+
def destroy_thread_local
|
56
|
+
self.string_io = nil
|
57
|
+
end
|
54
58
|
end
|
55
59
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe "BufferedLogger::LogDeviceProxy slow tests" do
|
4
|
+
before do
|
5
|
+
@logdev = mock()
|
6
|
+
@proxy = BufferedLogger::LogDeviceProxy.new(@logdev)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "flush" do
|
10
|
+
it "should handle multiple thread simutaneously calling it" do
|
11
|
+
@logdev.stubs(:write)
|
12
|
+
|
13
|
+
8.times do |iteration|
|
14
|
+
threads = []
|
15
|
+
8.times do
|
16
|
+
threads << Thread.new do
|
17
|
+
(iteration * 10_000).times do
|
18
|
+
@proxy.start
|
19
|
+
@proxy.flush
|
20
|
+
@proxy.end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
threads.each { |thr| thr.join }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -58,31 +58,4 @@ describe BufferedLogger::LogDeviceProxy do
|
|
58
58
|
@proxy.write("2")
|
59
59
|
assert_equal "12", @proxy.current_log
|
60
60
|
end
|
61
|
-
|
62
|
-
describe "sweep" do
|
63
|
-
it "should check if the thread is alive" do
|
64
|
-
thread = mock()
|
65
|
-
thread.expects(:alive?).returns(true)
|
66
|
-
Thread.stubs(:current).returns(thread)
|
67
|
-
|
68
|
-
@proxy.start
|
69
|
-
@proxy.sweep
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should remove dead threads or fibers" do
|
73
|
-
thread = mock()
|
74
|
-
thread.stubs(:alive?).returns(true)
|
75
|
-
Thread.stubs(:current).returns(thread)
|
76
|
-
|
77
|
-
@proxy.start
|
78
|
-
@proxy.sweep
|
79
|
-
assert @proxy.started?, "Proxy is not started"
|
80
|
-
|
81
|
-
thread.stubs(:alive?).returns(false)
|
82
|
-
|
83
|
-
@proxy.start
|
84
|
-
@proxy.sweep
|
85
|
-
assert !@proxy.started?, "Proxy is started"
|
86
|
-
end
|
87
|
-
end
|
88
61
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe "BufferedLogger slow tests" do
|
4
|
+
before do
|
5
|
+
@buffer = StringIO.new
|
6
|
+
@logger = BufferedLogger.new(@buffer)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should handle multiple thread simutaneously calling start with a block" do
|
10
|
+
16.times do
|
11
|
+
threads = []
|
12
|
+
8.times do
|
13
|
+
threads << Thread.new do
|
14
|
+
32768.times do
|
15
|
+
@logger.start {}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
threads.each { |thr| thr.join }
|
20
|
+
sleep(0.01 * rand)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buffered-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Kadolph
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mocha
|
@@ -55,8 +55,10 @@ files:
|
|
55
55
|
- lib/buffered_logger/middleware.rb
|
56
56
|
- lib/buffered_logger/rails.rb
|
57
57
|
- lib/buffered_logger/version.rb
|
58
|
+
- test/buffered_logger/log_device_proxy_slow_test.rb
|
58
59
|
- test/buffered_logger/log_device_proxy_test.rb
|
59
60
|
- test/buffered_logger/middleware_test.rb
|
61
|
+
- test/buffered_logger_slow_test.rb
|
60
62
|
- test/buffered_logger_test.rb
|
61
63
|
homepage: http://samuelkadolph.github.com/buffered-logger/
|
62
64
|
licenses: []
|
@@ -69,7 +71,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
69
71
|
requirements:
|
70
72
|
- - ">="
|
71
73
|
- !ruby/object:Gem::Version
|
72
|
-
version:
|
74
|
+
version: 2.0.0
|
73
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
76
|
requirements:
|
75
77
|
- - ">="
|
@@ -77,12 +79,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
79
|
version: '0'
|
78
80
|
requirements: []
|
79
81
|
rubyforge_project:
|
80
|
-
rubygems_version: 2.4.
|
82
|
+
rubygems_version: 2.4.8
|
81
83
|
signing_key:
|
82
84
|
specification_version: 4
|
83
85
|
summary: buffered-logger is a concurrency safe logger. It buffers each logging statement
|
84
86
|
and writes to the log file all at once.
|
85
87
|
test_files:
|
88
|
+
- test/buffered_logger/log_device_proxy_slow_test.rb
|
86
89
|
- test/buffered_logger/log_device_proxy_test.rb
|
87
90
|
- test/buffered_logger/middleware_test.rb
|
91
|
+
- test/buffered_logger_slow_test.rb
|
88
92
|
- test/buffered_logger_test.rb
|