fluent-logger 0.8.0 → 0.8.1
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 +5 -5
- data/ChangeLog +4 -0
- data/README.md +10 -2
- data/lib/fluent/logger/fluent_logger.rb +19 -4
- data/lib/fluent/logger/version.rb +1 -1
- data/spec/fluent_logger_spec.rb +51 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 24cb776c1db25b7c798ad762556f420eb345721c93832e6b40f38d7e67b49c09
|
4
|
+
data.tar.gz: bd6dc210af643d76189a5c3a2d86f953c9c68e49a2c4e037a3bd96b5d45e5a91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9eaec15cd63b3ceb83190c2748b23763f73f9a202c584011189c4f1941704830ac4cc04db317d49549748645a40a092f075be99601710ba1c1f659e0d4e91aa
|
7
|
+
data.tar.gz: 238c085430cce8cad552598e3e5be31b14747b669831d427aab03d13b1fb9256ee68fb9fd1a0d8f9a3d6d813eb458317867c017403a87bc7ffbf1a65002275d8
|
data/ChangeLog
CHANGED
data/README.md
CHANGED
@@ -27,6 +27,7 @@ require 'fluent-logger'
|
|
27
27
|
|
28
28
|
log = Fluent::Logger::FluentLogger.new(nil, :socket_path => "/tmp/fluent.sock")
|
29
29
|
unless log.post("myapp.access", {"agent" => "foo"})
|
30
|
+
# Passed records are stored into logger's internal buffer so don't re-post same event.
|
30
31
|
p log.last_error # You can get last error object via last_error method
|
31
32
|
end
|
32
33
|
|
@@ -49,10 +50,17 @@ log.post("access", {"agent" => "foo"})
|
|
49
50
|
require 'fluent-logger'
|
50
51
|
|
51
52
|
log = Fluent::Logger::FluentLogger.new(nil, :host => 'localhost', :port => 24224, :use_nonblock => true, :wait_writeable => false)
|
53
|
+
# When wait_writeable is false
|
52
54
|
begin
|
53
55
|
log.post("myapp.access", {"agent" => "foo"})
|
54
56
|
rescue IO::EAGAINWaitWritable => e
|
55
57
|
# wait code for avoding "Resource temporarily unavailable"
|
58
|
+
# Passed records are stored into logger's internal buffer so don't re-post same event.
|
59
|
+
end
|
60
|
+
|
61
|
+
# When wait_writeable is true
|
62
|
+
unless log.post("myapp.access", {"agent" => "foo"})
|
63
|
+
# same as other example
|
56
64
|
end
|
57
65
|
|
58
66
|
# output: myapp.access {"agent":"foo"}
|
@@ -88,11 +96,11 @@ Use nano second event time instead of epoch. See also "Tips" section.
|
|
88
96
|
|
89
97
|
#### use_nonblock (Bool)
|
90
98
|
|
91
|
-
Use nonblocking write(`IO#write_nonblock`) instead of normal write(`IO#write`). If `Logger#post` stuck on your environment, specify `true`.
|
99
|
+
Use nonblocking write(`IO#write_nonblock`) instead of normal write(`IO#write`). If `Logger#post` stuck on your environment, specify `true`. Default: `false`
|
92
100
|
|
93
101
|
#### wait_writeable (Bool)
|
94
102
|
|
95
|
-
If `
|
103
|
+
If `false`, `Logger#post` raises an error when nonblocking write gets `EAGAIN` (i.e. `use_nonblock` must be `true`, otherwise this will have no effect). Default: `true`
|
96
104
|
|
97
105
|
#### buffer_overflow_handler (Proc)
|
98
106
|
|
@@ -126,7 +126,6 @@ module Fluent
|
|
126
126
|
end
|
127
127
|
|
128
128
|
attr_accessor :limit, :logger, :log_reconnect_error_threshold
|
129
|
-
attr_reader :last_error
|
130
129
|
|
131
130
|
def last_error
|
132
131
|
@last_error[Thread.current.object_id]
|
@@ -230,7 +229,11 @@ module Fluent
|
|
230
229
|
end
|
231
230
|
|
232
231
|
begin
|
233
|
-
send_data(@pending)
|
232
|
+
written = send_data(@pending)
|
233
|
+
if @pending.bytesize != written
|
234
|
+
raise "Actual written data size(#{written} bytes) is different from the received data size(#{@pending.bytesize} bytes)."
|
235
|
+
end
|
236
|
+
|
234
237
|
@pending = nil
|
235
238
|
true
|
236
239
|
rescue => e
|
@@ -255,7 +258,7 @@ module Fluent
|
|
255
258
|
connect!
|
256
259
|
end
|
257
260
|
if @use_nonblock
|
258
|
-
|
261
|
+
send_data_nonblock(data)
|
259
262
|
else
|
260
263
|
@con.write data
|
261
264
|
end
|
@@ -272,7 +275,19 @@ module Fluent
|
|
272
275
|
# end
|
273
276
|
# data = data[n..-1]
|
274
277
|
#end
|
275
|
-
|
278
|
+
end
|
279
|
+
|
280
|
+
def send_data_nonblock(data)
|
281
|
+
written = @con.write_nonblock(data)
|
282
|
+
remaining = data.bytesize - written
|
283
|
+
|
284
|
+
while remaining > 0
|
285
|
+
len = @con.write_nonblock(data.byteslice(written, remaining))
|
286
|
+
remaining -= len
|
287
|
+
written += len
|
288
|
+
end
|
289
|
+
|
290
|
+
written
|
276
291
|
end
|
277
292
|
|
278
293
|
def connect!
|
data/spec/fluent_logger_spec.rb
CHANGED
@@ -58,6 +58,57 @@ describe Fluent::Logger::FluentLogger do
|
|
58
58
|
@serverengine.shutdown
|
59
59
|
end
|
60
60
|
|
61
|
+
describe('testing interaction of use_nonblock and wait_writeable') do
|
62
|
+
before(:example) do
|
63
|
+
allow_any_instance_of(TCPSocket).to receive(:write_nonblock).and_raise(IO::EAGAINWaitWritable)
|
64
|
+
allow_any_instance_of(TCPSocket).to receive(:write) { |_, buf| buf.size }
|
65
|
+
end
|
66
|
+
|
67
|
+
context('use_nonblock is false') do
|
68
|
+
let(:block_config) { logger_config.merge(use_nonblock: false) }
|
69
|
+
|
70
|
+
it('post returns true when wait_writeable is false') {
|
71
|
+
cfg = block_config.merge(wait_writeable: false)
|
72
|
+
l = Fluent::Logger::FluentLogger.new('logger-test', cfg)
|
73
|
+
expect(l.post('hello', foo: 'bar')).to eq true
|
74
|
+
}
|
75
|
+
|
76
|
+
it('post returns true when wait_writeable is true') {
|
77
|
+
cfg = block_config.merge(wait_writeable: true)
|
78
|
+
l = Fluent::Logger::FluentLogger.new('logger-test', cfg)
|
79
|
+
expect(l.post('hello', {foo: 'bar'})).to eq true
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
context('use_nonblock is true') do
|
84
|
+
let(:nonblock_config) { logger_config.merge(use_nonblock: true) }
|
85
|
+
|
86
|
+
it('post raises IO::EAGAINWaitWritable when wait_writeable is false') {
|
87
|
+
cfg = nonblock_config.merge(wait_writeable: false)
|
88
|
+
l = Fluent::Logger::FluentLogger.new('logger-test', cfg)
|
89
|
+
expect { l.post('hello', foo: 'bar') }.to raise_error(IO::EAGAINWaitWritable)
|
90
|
+
}
|
91
|
+
|
92
|
+
it('post returns false when wait_writeable is true') {
|
93
|
+
cfg = nonblock_config.merge(wait_writeable: true)
|
94
|
+
l = Fluent::Logger::FluentLogger.new('logger-test', cfg)
|
95
|
+
expect(l.post('hello', {foo: 'bar'})).to eq false
|
96
|
+
}
|
97
|
+
|
98
|
+
context 'when write_nonblock returns the size less than received data' do
|
99
|
+
before do
|
100
|
+
allow_any_instance_of(TCPSocket).to receive(:write_nonblock).and_return(1) # write 1 bytes per call
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'buffering data and flush at closed time' do
|
104
|
+
logger = Fluent::Logger::FluentLogger.new('logger-test', nonblock_config)
|
105
|
+
expect(logger.post('hello', foo: 'bar')).to eq(true)
|
106
|
+
expect(logger.pending_bytesize).to eq(0)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
61
112
|
context('Post by CUI') do
|
62
113
|
it('post') {
|
63
114
|
args = %W(-h localhost -p #{fluentd.port} -t logger-test.tag -v a=b -v foo=bar)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -161,8 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
161
|
- !ruby/object:Gem::Version
|
162
162
|
version: '0'
|
163
163
|
requirements: []
|
164
|
-
|
165
|
-
rubygems_version: 2.6.14.1
|
164
|
+
rubygems_version: 3.0.3
|
166
165
|
signing_key:
|
167
166
|
specification_version: 4
|
168
167
|
summary: fluent logger for ruby
|