fluent-logger 0.6.1 → 0.6.2
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/.travis.yml +3 -0
- data/ChangeLog +5 -0
- data/README.md +23 -10
- data/VERSION +1 -1
- data/lib/fluent/logger/fluent_logger.rb +20 -7
- data/lib/fluent/logger/level_fluent_logger.rb +2 -2
- data/lib/fluent/logger/version.rb +1 -1
- data/spec/fluent_logger_spec.rb +44 -0
- data/spec/level_fluent_logger_spec.rb +4 -1
- data/spec/support/dummy_fluentd.rb +27 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfed8c8167db552fe22b3b030b62041a5b523636
|
4
|
+
data.tar.gz: fdca6f7fcb62bb64364ae76af2a05bb287756ba2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dae9cd5b7df431025125450fa88e53700d6a6b2b16d78ff327fb3e5f5ea4599023cec6afeae588251ba2e88a5e7d31cb6746466f9882fa855d68d0960be2026a
|
7
|
+
data.tar.gz: 0e3b5eb2f7a88a20295779c63a556201eb3d2c1098488f92a6dcc9ee93b5630f0d9770803ffc5c99d7370105ed244b50e49e0ed8c21001b493b9a331d858fb4e
|
data/.travis.yml
CHANGED
data/ChangeLog
CHANGED
data/README.md
CHANGED
@@ -11,8 +11,21 @@ A structured event logger
|
|
11
11
|
```ruby
|
12
12
|
require 'fluent-logger'
|
13
13
|
|
14
|
-
log = Fluent::Logger::FluentLogger.new(nil, :host=>'localhost', :port=>24224)
|
15
|
-
unless log.post("myapp.access", {"agent"=>"foo"})
|
14
|
+
log = Fluent::Logger::FluentLogger.new(nil, :host => 'localhost', :port => 24224)
|
15
|
+
unless log.post("myapp.access", {"agent" => "foo"})
|
16
|
+
p log.last_error # You can get last error object via last_error method
|
17
|
+
end
|
18
|
+
|
19
|
+
# output: myapp.access {"agent":"foo"}
|
20
|
+
```
|
21
|
+
|
22
|
+
### UNIX socket
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
require 'fluent-logger'
|
26
|
+
|
27
|
+
log = Fluent::Logger::FluentLogger.new(nil, :socket_path => "/tmp/fluent.sock")
|
28
|
+
unless log.post("myapp.access", {"agent" => "foo"})
|
16
29
|
p log.last_error # You can get last error object via last_error method
|
17
30
|
end
|
18
31
|
|
@@ -23,8 +36,8 @@ end
|
|
23
36
|
```ruby
|
24
37
|
require 'fluent-logger'
|
25
38
|
|
26
|
-
Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)
|
27
|
-
Fluent::Logger.post("myapp.access", {"agent"=>"foo"})
|
39
|
+
Fluent::Logger::FluentLogger.open(nil, :host => 'localhost', :port => 24224)
|
40
|
+
Fluent::Logger.post("myapp.access", {"agent" => "foo"})
|
28
41
|
|
29
42
|
# output: myapp.access {"agent":"foo"}
|
30
43
|
```
|
@@ -33,8 +46,8 @@ Fluent::Logger.post("myapp.access", {"agent"=>"foo"})
|
|
33
46
|
```ruby
|
34
47
|
require 'fluent-logger'
|
35
48
|
|
36
|
-
log = Fluent::Logger::FluentLogger.new('myapp', :host=>'localhost', :port=>24224)
|
37
|
-
log.post("access", {"agent"=>"foo"})
|
49
|
+
log = Fluent::Logger::FluentLogger.new('myapp', :host => 'localhost', :port => 24224)
|
50
|
+
log.post("access", {"agent" => "foo"})
|
38
51
|
|
39
52
|
# output: myapp.access {"agent":"foo"}
|
40
53
|
```
|
@@ -59,7 +72,7 @@ f.warn("some application running.")
|
|
59
72
|
```ruby
|
60
73
|
require 'fluent-logger'
|
61
74
|
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
62
|
-
f.info("some_application"){"some application running."}
|
75
|
+
f.info("some_application") {"some application running."}
|
63
76
|
# output: fluent.info: {"level":"INFO","message":"some application running.","progname":"some_application"}
|
64
77
|
```
|
65
78
|
|
@@ -69,7 +82,7 @@ f.info("some_application"){"some application running."}
|
|
69
82
|
require 'fluent-logger'
|
70
83
|
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
71
84
|
f.level = Logger::WARN
|
72
|
-
f.info("some_application"){"some application running."}
|
85
|
+
f.info("some_application") {"some application running."}
|
73
86
|
```
|
74
87
|
|
75
88
|
Log level is ERROR so no output.
|
@@ -84,7 +97,7 @@ require 'fluent-logger'
|
|
84
97
|
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
85
98
|
|
86
99
|
f.formatter = proc do |severity, datetime, progname, message|
|
87
|
-
map = { level: severity
|
100
|
+
map = { level: severity }
|
88
101
|
map[:message] = message if message
|
89
102
|
map[:progname] = progname if progname
|
90
103
|
map[:stage] = ENV['RAILS_ENV']
|
@@ -100,7 +113,7 @@ f.info("some_application"){"some application running."}
|
|
100
113
|
|
101
114
|
### Fluent
|
102
115
|
```ruby
|
103
|
-
Fluent::Logger::FluentLogger.open('tag_prefix', :host=>'localhost', :port=>24224)
|
116
|
+
Fluent::Logger::FluentLogger.open('tag_prefix', :host => 'localhost', :port => 24224)
|
104
117
|
```
|
105
118
|
|
106
119
|
### Console
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.2
|
@@ -29,7 +29,7 @@ module Fluent
|
|
29
29
|
RECONNECT_WAIT_INCR_RATE = 1.5
|
30
30
|
RECONNECT_WAIT_MAX = 60
|
31
31
|
RECONNECT_WAIT_MAX_COUNT =
|
32
|
-
(1..100).inject(RECONNECT_WAIT_MAX / RECONNECT_WAIT) {|r,i|
|
32
|
+
(1..100).inject(RECONNECT_WAIT_MAX / RECONNECT_WAIT) { |r, i|
|
33
33
|
break i + 1 if r < RECONNECT_WAIT_INCR_RATE
|
34
34
|
r / RECONNECT_WAIT_INCR_RATE
|
35
35
|
}
|
@@ -54,16 +54,16 @@ module Fluent
|
|
54
54
|
@tag_prefix = tag_prefix
|
55
55
|
@host = options[:host]
|
56
56
|
@port = options[:port]
|
57
|
+
@socket_path = options[:socket_path]
|
57
58
|
|
58
59
|
@mon = Monitor.new
|
59
60
|
@pending = nil
|
60
61
|
@connect_error_history = []
|
61
62
|
|
62
63
|
@limit = options[:buffer_limit] || BUFFER_LIMIT
|
63
|
-
@log_reconnect_error_threshold = options[:log_reconnect_error_threshold] ||
|
64
|
+
@log_reconnect_error_threshold = options[:log_reconnect_error_threshold] || RECONNECT_WAIT_MAX_COUNT
|
64
65
|
|
65
66
|
@buffer_overflow_handler = options[:buffer_overflow_handler]
|
66
|
-
|
67
67
|
if logger = options[:logger]
|
68
68
|
@logger = logger
|
69
69
|
else
|
@@ -108,7 +108,7 @@ module Fluent
|
|
108
108
|
send_data(@pending)
|
109
109
|
rescue => e
|
110
110
|
set_last_error(e)
|
111
|
-
@logger.error("FluentLogger: Can't send logs to #{
|
111
|
+
@logger.error("FluentLogger: Can't send logs to #{connection_string}: #{$!}")
|
112
112
|
call_buffer_overflow_handler(@pending)
|
113
113
|
end
|
114
114
|
end
|
@@ -123,7 +123,20 @@ module Fluent
|
|
123
123
|
@con && !@con.closed?
|
124
124
|
end
|
125
125
|
|
126
|
+
def create_socket!
|
127
|
+
if @socket_path
|
128
|
+
@con = UNIXSocket.new(@socket_path)
|
129
|
+
else
|
130
|
+
@con = TCPSocket.new(@host, @port)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def connection_string
|
135
|
+
@socket_path ? "#{@socket_path}" : "#{@host}:#{@port}"
|
136
|
+
end
|
137
|
+
|
126
138
|
private
|
139
|
+
|
127
140
|
def to_msgpack(msg)
|
128
141
|
begin
|
129
142
|
msg.to_msgpack
|
@@ -170,7 +183,7 @@ module Fluent
|
|
170
183
|
rescue => e
|
171
184
|
set_last_error(e)
|
172
185
|
if @pending.bytesize > @limit
|
173
|
-
@logger.error("FluentLogger: Can't send logs to #{
|
186
|
+
@logger.error("FluentLogger: Can't send logs to #{connection_string}: #{$!}")
|
174
187
|
call_buffer_overflow_handler(@pending)
|
175
188
|
@pending = nil
|
176
189
|
end
|
@@ -203,7 +216,7 @@ module Fluent
|
|
203
216
|
end
|
204
217
|
|
205
218
|
def connect!
|
206
|
-
|
219
|
+
create_socket!
|
207
220
|
@con.sync = true
|
208
221
|
@connect_error_history.clear
|
209
222
|
@logged_reconnect_error = false
|
@@ -230,7 +243,7 @@ module Fluent
|
|
230
243
|
end
|
231
244
|
|
232
245
|
def log_reconnect_error
|
233
|
-
@logger.error("FluentLogger: Can't connect to #{
|
246
|
+
@logger.error("FluentLogger: Can't connect to #{connection_string}(#{@connect_error_history.size} retried): #{$!}")
|
234
247
|
end
|
235
248
|
|
236
249
|
def set_last_error(e)
|
@@ -28,7 +28,7 @@ module Fluent
|
|
28
28
|
def initialize(tag_prefix = nil, *args)
|
29
29
|
@level = ::Logger::DEBUG
|
30
30
|
@default_formatter = proc do |severity, datetime, progname, message|
|
31
|
-
map = { level:
|
31
|
+
map = { level: severity }
|
32
32
|
map[:message] = message if message
|
33
33
|
map[:progname] = progname if progname
|
34
34
|
map
|
@@ -50,7 +50,7 @@ module Fluent
|
|
50
50
|
progname = @progname
|
51
51
|
end
|
52
52
|
end
|
53
|
-
map = format_message(severity, Time.now, progname, message)
|
53
|
+
map = format_message(format_severity(severity), Time.now, progname, message)
|
54
54
|
@fluent_logger.post(format_severity(severity).downcase, map)
|
55
55
|
true
|
56
56
|
end
|
data/spec/fluent_logger_spec.rb
CHANGED
@@ -119,6 +119,8 @@ describe Fluent::Logger::FluentLogger do
|
|
119
119
|
expect {
|
120
120
|
logger.post('tag', data)
|
121
121
|
}.to raise_error(ArgumentError)
|
122
|
+
|
123
|
+
fluentd.wait_transfer # ensure the fluentd accepted the connection
|
122
124
|
}
|
123
125
|
end
|
124
126
|
|
@@ -128,6 +130,7 @@ describe Fluent::Logger::FluentLogger do
|
|
128
130
|
host, port = fluent_logger.instance_eval { [@host, @port] }
|
129
131
|
expect(host).to eq 'localhost'
|
130
132
|
expect(port).to eq fluentd.port
|
133
|
+
fluentd.wait_transfer # ensure the fluentd accepted the connection
|
131
134
|
end
|
132
135
|
|
133
136
|
it "hash argument" do
|
@@ -139,6 +142,7 @@ describe Fluent::Logger::FluentLogger do
|
|
139
142
|
host, port = fluent_logger.instance_eval { [@host, @port] }
|
140
143
|
expect(host).to eq 'localhost'
|
141
144
|
expect(port).to eq fluentd.port
|
145
|
+
fluentd.wait_transfer # ensure the fluentd accepted the connection
|
142
146
|
end
|
143
147
|
end
|
144
148
|
end
|
@@ -226,4 +230,44 @@ describe Fluent::Logger::FluentLogger do
|
|
226
230
|
end
|
227
231
|
end
|
228
232
|
end
|
233
|
+
|
234
|
+
context "using socket_path" do
|
235
|
+
|
236
|
+
let(:socket_logger) {
|
237
|
+
@logger_io = StringIO.new
|
238
|
+
logger = ::Logger.new(@logger_io)
|
239
|
+
Fluent::Logger::FluentLogger.new('logger-test', {
|
240
|
+
:socket_path => fluentd.socket_path,
|
241
|
+
:logger => logger,
|
242
|
+
:buffer_overflow_handler => buffer_overflow_handler
|
243
|
+
})
|
244
|
+
}
|
245
|
+
|
246
|
+
context "running fluentd" do
|
247
|
+
before(:all) do
|
248
|
+
@serverengine = DummyServerengine.new
|
249
|
+
@serverengine.startup
|
250
|
+
end
|
251
|
+
|
252
|
+
before(:each) do
|
253
|
+
fluentd.socket_startup
|
254
|
+
end
|
255
|
+
|
256
|
+
after(:each) do
|
257
|
+
fluentd.shutdown
|
258
|
+
end
|
259
|
+
|
260
|
+
after(:all) do
|
261
|
+
@serverengine.shutdown
|
262
|
+
end
|
263
|
+
|
264
|
+
context('post') do
|
265
|
+
it ('success') {
|
266
|
+
expect(socket_logger.post('tag', {'b' => 'a'})).to be true
|
267
|
+
fluentd.wait_transfer
|
268
|
+
expect(fluentd.queue.last).to eq ['logger-test.tag', {'b' => 'a'}]
|
269
|
+
}
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
229
273
|
end
|
@@ -57,12 +57,14 @@ describe Fluent::Logger::FluentLogger do
|
|
57
57
|
})
|
58
58
|
expect(level_fluent_logger.level).to eq 0
|
59
59
|
expect(level_fluent_logger.progname).to be_nil
|
60
|
+
fluentd.wait_transfer # ensure the fluentd accepted the connection
|
60
61
|
}
|
61
62
|
|
62
63
|
it ('close') {
|
63
64
|
expect(level_logger).to be_connect
|
64
65
|
level_logger.close
|
65
66
|
expect(level_logger).not_to be_connect
|
67
|
+
fluentd.wait_transfer # ensure the fluentd accepted the connection
|
66
68
|
}
|
67
69
|
|
68
70
|
it ('reopen') {
|
@@ -70,6 +72,7 @@ describe Fluent::Logger::FluentLogger do
|
|
70
72
|
level_logger.reopen
|
71
73
|
expect(level_logger).not_to be_connect
|
72
74
|
expect(level_logger.info('logger reopen test')).to be true
|
75
|
+
fluentd.wait_transfer # ensure the fluentd accepted the connection
|
73
76
|
}
|
74
77
|
end
|
75
78
|
|
@@ -145,7 +148,7 @@ describe Fluent::Logger::FluentLogger do
|
|
145
148
|
it ('define formatter') {
|
146
149
|
level_logger.level = ::Logger::DEBUG
|
147
150
|
level_logger.formatter = proc do |severity, datetime, progname, message|
|
148
|
-
map = { level: severity
|
151
|
+
map = { level: severity }
|
149
152
|
map[:message] = message if message
|
150
153
|
map[:progname] = progname if progname
|
151
154
|
map[:stage] = "development"
|
@@ -9,7 +9,8 @@ class DummyFluentd
|
|
9
9
|
output.emits.clear rescue nil
|
10
10
|
end
|
11
11
|
|
12
|
-
WAIT = ENV['WAIT'] ? ENV['WAIT'].to_f : 0.
|
12
|
+
WAIT = ENV['WAIT'] ? ENV['WAIT'].to_f : 0.3
|
13
|
+
SOCKET_PATH = ENV['SOCKET_PATH'] || "/tmp/dummy_fluent.sock"
|
13
14
|
|
14
15
|
def wait_transfer
|
15
16
|
sleep WAIT
|
@@ -29,6 +30,10 @@ class DummyFluentd
|
|
29
30
|
@port
|
30
31
|
end
|
31
32
|
|
33
|
+
def socket_path
|
34
|
+
SOCKET_PATH
|
35
|
+
end
|
36
|
+
|
32
37
|
def output
|
33
38
|
sleep 0.0001 # next tick
|
34
39
|
if Fluent::Engine.respond_to?(:match)
|
@@ -40,7 +45,7 @@ class DummyFluentd
|
|
40
45
|
|
41
46
|
def queue
|
42
47
|
queue = []
|
43
|
-
output.emits.each {|tag, time, record|
|
48
|
+
output.emits.each { |tag, time, record|
|
44
49
|
queue << [tag, record]
|
45
50
|
}
|
46
51
|
queue
|
@@ -66,6 +71,26 @@ EOF
|
|
66
71
|
wait_transfer
|
67
72
|
end
|
68
73
|
|
74
|
+
def socket_startup
|
75
|
+
config = Fluent::Config.parse(<<EOF, '(logger-spec)', '(logger-spec-dir)', true)
|
76
|
+
<source>
|
77
|
+
type unix
|
78
|
+
path #{socket_path}
|
79
|
+
</source>
|
80
|
+
<match logger-test.**>
|
81
|
+
type test
|
82
|
+
</match>
|
83
|
+
EOF
|
84
|
+
Fluent::Test.setup
|
85
|
+
Fluent::Engine.run_configure(config)
|
86
|
+
@coolio_default_loop = nil
|
87
|
+
@thread = Thread.new {
|
88
|
+
@coolio_default_loop = Coolio::Loop.default
|
89
|
+
Fluent::Engine.run
|
90
|
+
}
|
91
|
+
wait_transfer
|
92
|
+
end
|
93
|
+
|
69
94
|
def shutdown
|
70
95
|
@coolio_default_loop.stop rescue nil
|
71
96
|
begin
|
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.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -162,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
162
|
version: '0'
|
163
163
|
requirements: []
|
164
164
|
rubyforge_project:
|
165
|
-
rubygems_version: 2.5.
|
165
|
+
rubygems_version: 2.5.2
|
166
166
|
signing_key:
|
167
167
|
specification_version: 4
|
168
168
|
summary: fluent logger for ruby
|