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 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