buffered-logger 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24814e281866d206c20b1ab4826011c242388f09
4
- data.tar.gz: 187721e040994930211c3a08ffcc3cdc4761ddda
3
+ metadata.gz: 6b22772662c4a00e7c497ccde9cfa8be61cd66c6
4
+ data.tar.gz: 00658ed94b4dcdf3d318eaca0eb53c6e3306510c
5
5
  SHA512:
6
- metadata.gz: ca6cd186fb7a430f22c62f96eb282d665ee6cca36c5746b96e31697242d6394b0124d5635378e422ccbb564387af97262dcdc3d8befb358afd11d1818210414b
7
- data.tar.gz: 748a9b6f43f68beee1bfc6dc4fea62884fa2e22f16324e04e73313824b7e76015f974336e24139442fdae1ac823260ca5db1f866da2e4f0a06df3cd3977cc008
6
+ metadata.gz: 1a4f915cde421f9af0b57ad267270c980938b16f576421e516221e0e41dd60fec63539895efce09d926590d3b1abf5acd40d18612ef29b6cf65e7e192428830e
7
+ data.tar.gz: 8d08829ec1ff7ce51733142f03b544433450a88cd9f1f81cba8d289cbb65e4aeaf4cffc8fb82e3350822767152a3466851e19bc2b5dd2c3653b186ed5abae275
@@ -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
- @buffers = {}
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(@buffers.delete(key).string)
17
+ @logdev.write(string_io.string)
18
+ destroy_thread_local
16
19
  end
17
20
 
18
21
  def flush
19
- log, @buffers[key] = @buffers.delete(key).string, StringIO.new
20
- @logdev.write(log)
22
+ @logdev.write(string_io.string)
23
+ string_io.string.clear
21
24
  end
22
25
 
23
26
  def start
24
- @buffers[key] = StringIO.new
27
+ self.string_io = StringIO.new
25
28
  end
26
29
 
27
30
  def started?
28
- @buffers.key?(key)
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
- @buffers[key].write(message)
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
- @buffers[key].string.dup
43
+ string_io.string.dup
48
44
  end
49
45
 
50
46
  private
51
- def key
52
- [Thread.current]
53
- end
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
@@ -1,5 +1,5 @@
1
1
  require "logger"
2
2
 
3
3
  class BufferedLogger < Logger
4
- VERSION = "1.2.2"
4
+ VERSION = "2.0.0"
5
5
  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: 1.2.2
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: 2015-07-14 00:00:00.000000000 Z
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: 1.9.2
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.6
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