fluent-logger 0.6.0 → 0.6.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 +4 -4
- data/.travis.yml +20 -3
- data/ChangeLog +9 -0
- data/Gemfile +2 -1
- data/Gemfile.v0.12 +6 -0
- data/README.md +59 -0
- data/VERSION +1 -1
- data/lib/fluent/logger.rb +8 -7
- data/lib/fluent/logger/level_fluent_logger.rb +73 -0
- data/lib/fluent/logger/logger_base.rb +1 -1
- data/lib/fluent/logger/version.rb +1 -1
- data/spec/fluent_logger_spec.rb +40 -90
- data/spec/level_fluent_logger_spec.rb +165 -0
- data/spec/plugin/out_test.rb +8 -0
- data/spec/support/dummy_fluentd.rb +82 -0
- data/spec/support/dummy_serverengine.rb +18 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b697bc01bf042c2ecafc345c71dd0c133d08519f
|
4
|
+
data.tar.gz: 490cf5426952cca33f6a6a98cd4d150ef2ddad43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d72fb3e957716c2003be82e669da0d14902631f98c710e32b530a5c099bbd56ec1e91e4cc392da55c00c0aaf11de08431682458e5ef32fbcaa6c78bda2efa371
|
7
|
+
data.tar.gz: 16783931f838a10cf82346f918faff6d8bab0f47172eaaf1bbc991a01549f2e704a3c45fa32f379b6133a481ca6b9b3a2b54793e473cbec321773df05d41944c
|
data/.travis.yml
CHANGED
@@ -3,12 +3,29 @@ rvm:
|
|
3
3
|
- 2.0.0
|
4
4
|
- 2.1
|
5
5
|
- 2.2
|
6
|
-
- 2.3.
|
7
|
-
-
|
6
|
+
- 2.3.1
|
7
|
+
- ruby-head
|
8
|
+
|
9
|
+
gemfile:
|
10
|
+
- Gemfile
|
11
|
+
- Gemfile.v0.12
|
8
12
|
|
9
13
|
before_install: gem update bundler
|
10
14
|
script: bundle exec rake spec
|
11
15
|
|
16
|
+
sudo: false
|
17
|
+
|
12
18
|
matrix:
|
13
19
|
allow_failures:
|
14
|
-
- rvm:
|
20
|
+
- rvm: ruby-head
|
21
|
+
exclude:
|
22
|
+
- rvm: 1.9.3
|
23
|
+
gemfile: Gemfile
|
24
|
+
- rvm: 2.0.0
|
25
|
+
gemfile: Gemfile
|
26
|
+
- rvm: 2.2
|
27
|
+
gemfile: Gemfile.v0.12
|
28
|
+
- rvm: 2.3.1
|
29
|
+
gemfile: Gemfile.v0.12
|
30
|
+
- rvm: ruby-head
|
31
|
+
gemfile: Gemfile.v0.12
|
data/ChangeLog
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
Release 0.6.1 - 2016/11/02
|
2
|
+
|
3
|
+
* Add LevelFluentLogger: Standard Logger compatible interface
|
4
|
+
|
5
|
+
Release 0.6.0 - 2016/10/15
|
6
|
+
|
7
|
+
* Relax msgpack dependency
|
8
|
+
* ConsoleLogger: close io if io is stdout
|
9
|
+
|
1
10
|
Release 0.5.1 - 2015/11/24
|
2
11
|
|
3
12
|
* Allow injection of buffer overflow handler
|
data/Gemfile
CHANGED
data/Gemfile.v0.12
ADDED
data/README.md
CHANGED
@@ -39,6 +39,63 @@ log.post("access", {"agent"=>"foo"})
|
|
39
39
|
# output: myapp.access {"agent":"foo"}
|
40
40
|
```
|
41
41
|
|
42
|
+
### Standard ::Logger compatible interface
|
43
|
+
|
44
|
+
#### Example1
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
require 'fluent-logger'
|
48
|
+
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
49
|
+
|
50
|
+
f.info("some application running.")
|
51
|
+
# output: fluent.info: {"level":"INFO","message":"some application running."}
|
52
|
+
|
53
|
+
f.warn("some application running.")
|
54
|
+
# output: fluent.warn: {"level":"WARN","message":"some application running."}
|
55
|
+
```
|
56
|
+
|
57
|
+
#### Example2(add progname)
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
require 'fluent-logger'
|
61
|
+
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
62
|
+
f.info("some_application"){"some application running."}
|
63
|
+
# output: fluent.info: {"level":"INFO","message":"some application running.","progname":"some_application"}
|
64
|
+
```
|
65
|
+
|
66
|
+
#### Example3(set log level)
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
require 'fluent-logger'
|
70
|
+
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
71
|
+
f.level = Logger::WARN
|
72
|
+
f.info("some_application"){"some application running."}
|
73
|
+
```
|
74
|
+
|
75
|
+
Log level is ERROR so no output.
|
76
|
+
|
77
|
+
default log level is debug.
|
78
|
+
|
79
|
+
|
80
|
+
#### Example4(customize format for Rails)
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
require 'fluent-logger'
|
84
|
+
f = Fluent::Logger::LevelFluentLogger.new('fluent')
|
85
|
+
|
86
|
+
f.formatter = proc do |severity, datetime, progname, message|
|
87
|
+
map = { level: severity.class == Fixnum ? %w(DEBUG INFO WARN ERROR FATAL ANY)[severity] : severity }
|
88
|
+
map[:message] = message if message
|
89
|
+
map[:progname] = progname if progname
|
90
|
+
map[:stage] = ENV['RAILS_ENV']
|
91
|
+
map[:service_name] = "SomeApp"
|
92
|
+
map
|
93
|
+
end
|
94
|
+
|
95
|
+
f.info("some_application"){"some application running."}
|
96
|
+
# output: fluent.info: {"level":"INFO","message":"some application running.","progname":"some_application","stage":"production","service_name":"SomeApp"}
|
97
|
+
```
|
98
|
+
|
42
99
|
## Loggers
|
43
100
|
|
44
101
|
### Fluent
|
@@ -82,6 +139,8 @@ Fluent::Logger::FluentLogger.new(nil,
|
|
82
139
|
:buffer_overflow_handler => handler)
|
83
140
|
```
|
84
141
|
|
142
|
+
## Information
|
143
|
+
|
85
144
|
|name|description|
|
86
145
|
|---|---|
|
87
146
|
|Web site|http://fluentd.org/|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.1
|
data/lib/fluent/logger.rb
CHANGED
@@ -17,13 +17,14 @@
|
|
17
17
|
#
|
18
18
|
module Fluent
|
19
19
|
module Logger
|
20
|
-
autoload :ConsoleLogger
|
21
|
-
autoload :FluentLogger
|
22
|
-
autoload :
|
23
|
-
autoload :
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :
|
20
|
+
autoload :ConsoleLogger , 'fluent/logger/console_logger'
|
21
|
+
autoload :FluentLogger , 'fluent/logger/fluent_logger'
|
22
|
+
autoload :LevelFluentLogger , 'fluent/logger/level_fluent_logger'
|
23
|
+
autoload :LoggerBase , 'fluent/logger/logger_base'
|
24
|
+
autoload :TestLogger , 'fluent/logger/test_logger'
|
25
|
+
autoload :TextLogger , 'fluent/logger/text_logger'
|
26
|
+
autoload :NullLogger , 'fluent/logger/null_logger'
|
27
|
+
autoload :VERSION , 'fluent/logger/version'
|
27
28
|
|
28
29
|
@@default_logger = nil
|
29
30
|
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#
|
2
|
+
# Fluent
|
3
|
+
#
|
4
|
+
# Copyright (C) 2011 FURUHASHI Sadayuki
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
require 'msgpack'
|
19
|
+
require 'socket'
|
20
|
+
require 'monitor'
|
21
|
+
require 'logger'
|
22
|
+
require 'json'
|
23
|
+
|
24
|
+
module Fluent
|
25
|
+
module Logger
|
26
|
+
class LevelFluentLogger < ::Logger
|
27
|
+
|
28
|
+
def initialize(tag_prefix = nil, *args)
|
29
|
+
@level = ::Logger::DEBUG
|
30
|
+
@default_formatter = proc do |severity, datetime, progname, message|
|
31
|
+
map = { level: format_severity(severity) }
|
32
|
+
map[:message] = message if message
|
33
|
+
map[:progname] = progname if progname
|
34
|
+
map
|
35
|
+
end
|
36
|
+
@fluent_logger = FluentLogger.new(tag_prefix, *args)
|
37
|
+
end
|
38
|
+
|
39
|
+
def add(severity, message = nil, progname = nil, &block)
|
40
|
+
severity ||= UNKNOWN
|
41
|
+
if severity < @level
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
progname ||= @progname
|
45
|
+
if message.nil?
|
46
|
+
if block_given?
|
47
|
+
message = yield
|
48
|
+
else
|
49
|
+
message = progname
|
50
|
+
progname = @progname
|
51
|
+
end
|
52
|
+
end
|
53
|
+
map = format_message(severity, Time.now, progname, message)
|
54
|
+
@fluent_logger.post(format_severity(severity).downcase, map)
|
55
|
+
true
|
56
|
+
end
|
57
|
+
|
58
|
+
def close
|
59
|
+
@fluent_logger.close
|
60
|
+
end
|
61
|
+
|
62
|
+
def reopen
|
63
|
+
@fluent_logger.close
|
64
|
+
# we do not call #connect! here because 1) FluentLogger#connect! is not a public method
|
65
|
+
# 2) #post automatically connects if its connection is closed
|
66
|
+
end
|
67
|
+
|
68
|
+
def connect?
|
69
|
+
@fluent_logger.connect?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -23,7 +23,7 @@ module Fluent
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def post(tag, map)
|
26
|
-
raise ArgumentError.new("Second argument
|
26
|
+
raise ArgumentError.new("Second argument must be a kind of Hash (#{tag}: #{map})") unless map.kind_of? Hash
|
27
27
|
post_with_time(tag, map, Time.now)
|
28
28
|
end
|
29
29
|
|
data/spec/fluent_logger_spec.rb
CHANGED
@@ -1,31 +1,15 @@
|
|
1
1
|
|
2
2
|
require 'spec_helper'
|
3
|
+
require 'support/dummy_serverengine'
|
4
|
+
require 'support/dummy_fluentd'
|
3
5
|
|
4
|
-
require 'fluent/load'
|
5
|
-
require 'fluent/test'
|
6
|
-
require 'tempfile'
|
7
6
|
require 'logger'
|
8
|
-
require 'socket'
|
9
7
|
require 'stringio'
|
10
8
|
require 'fluent/logger/fluent_logger/cui'
|
11
|
-
require 'plugin/out_test'
|
12
|
-
|
13
|
-
$log = Fluent::Log.new(StringIO.new) # XXX should remove $log from fluentd
|
14
9
|
|
15
10
|
describe Fluent::Logger::FluentLogger do
|
16
|
-
|
17
|
-
|
18
|
-
let(:fluentd_port) {
|
19
|
-
port = 60001
|
20
|
-
loop do
|
21
|
-
begin
|
22
|
-
TCPServer.open('localhost', port).close
|
23
|
-
break
|
24
|
-
rescue Errno::EADDRINUSE
|
25
|
-
port += 1
|
26
|
-
end
|
27
|
-
end
|
28
|
-
port
|
11
|
+
let(:fluentd) {
|
12
|
+
DummyFluentd.new
|
29
13
|
}
|
30
14
|
|
31
15
|
let(:logger) {
|
@@ -33,7 +17,7 @@ describe Fluent::Logger::FluentLogger do
|
|
33
17
|
logger = ::Logger.new(@logger_io)
|
34
18
|
Fluent::Logger::FluentLogger.new('logger-test', {
|
35
19
|
:host => 'localhost',
|
36
|
-
:port =>
|
20
|
+
:port => fluentd.port,
|
37
21
|
:logger => logger,
|
38
22
|
:buffer_overflow_handler => buffer_overflow_handler
|
39
23
|
})
|
@@ -45,72 +29,38 @@ describe Fluent::Logger::FluentLogger do
|
|
45
29
|
@logger_io
|
46
30
|
}
|
47
31
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
else
|
53
|
-
Fluent::Engine.root_agent.event_router.match('logger-test')
|
32
|
+
context "running fluentd" do
|
33
|
+
before(:all) do
|
34
|
+
@serverengine = DummyServerengine.new
|
35
|
+
@serverengine.startup
|
54
36
|
end
|
55
|
-
}
|
56
|
-
|
57
|
-
let(:queue) {
|
58
|
-
queue = []
|
59
|
-
output.emits.each {|tag, time, record|
|
60
|
-
queue << [tag, record]
|
61
|
-
}
|
62
|
-
queue
|
63
|
-
}
|
64
37
|
|
65
|
-
after(:each) do
|
66
|
-
output.emits.clear rescue nil
|
67
|
-
end
|
68
|
-
|
69
|
-
def wait_transfer
|
70
|
-
sleep WAIT
|
71
|
-
end
|
72
|
-
|
73
|
-
context "running fluentd" do
|
74
38
|
before(:each) do
|
75
|
-
|
76
|
-
<source>
|
77
|
-
type forward
|
78
|
-
port #{fluentd_port}
|
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
|
39
|
+
fluentd.startup
|
92
40
|
end
|
93
41
|
|
94
42
|
after(:each) do
|
95
|
-
|
96
|
-
|
97
|
-
|
43
|
+
fluentd.shutdown
|
44
|
+
end
|
45
|
+
|
46
|
+
after(:all) do
|
47
|
+
@serverengine.shutdown
|
98
48
|
end
|
99
49
|
|
100
50
|
context('Post by CUI') do
|
101
51
|
it('post') {
|
102
|
-
args = %W(-h localhost -p #{
|
52
|
+
args = %W(-h localhost -p #{fluentd.port} -t logger-test.tag -v a=b -v foo=bar)
|
103
53
|
Fluent::Logger::FluentLogger::CUI.post(args)
|
104
|
-
wait_transfer
|
105
|
-
expect(queue.last).to eq ['logger-test.tag', {'a' => 'b', 'foo' => 'bar'}]
|
54
|
+
fluentd.wait_transfer
|
55
|
+
expect(fluentd.queue.last).to eq ['logger-test.tag', {'a' => 'b', 'foo' => 'bar'}]
|
106
56
|
}
|
107
57
|
end
|
108
58
|
|
109
59
|
context('post') do
|
110
60
|
it ('success') {
|
111
61
|
expect(logger.post('tag', {'a' => 'b'})).to be true
|
112
|
-
wait_transfer
|
113
|
-
expect(queue.last).to eq ['logger-test.tag', {'a' => 'b'}]
|
62
|
+
fluentd.wait_transfer
|
63
|
+
expect(fluentd.queue.last).to eq ['logger-test.tag', {'a' => 'b'}]
|
114
64
|
}
|
115
65
|
|
116
66
|
it ('close after post') {
|
@@ -120,15 +70,15 @@ EOF
|
|
120
70
|
|
121
71
|
logger.post('tag', {'b' => 'c'})
|
122
72
|
expect(logger).to be_connect
|
123
|
-
wait_transfer
|
124
|
-
expect(queue.last).to eq ['logger-test.tag', {'b' => 'c'}]
|
73
|
+
fluentd.wait_transfer
|
74
|
+
expect(fluentd.queue.last).to eq ['logger-test.tag', {'b' => 'c'}]
|
125
75
|
}
|
126
76
|
|
127
77
|
it ('large data') {
|
128
78
|
data = {'a' => ('b' * 1000000)}
|
129
79
|
logger.post('tag', data)
|
130
|
-
wait_transfer
|
131
|
-
expect(queue.last).to eq ['logger-test.tag', data]
|
80
|
+
fluentd.wait_transfer
|
81
|
+
expect(fluentd.queue.last).to eq ['logger-test.tag', data]
|
132
82
|
}
|
133
83
|
|
134
84
|
it ('msgpack unsupport data') {
|
@@ -138,8 +88,8 @@ EOF
|
|
138
88
|
'proc' => proc { 1 },
|
139
89
|
}
|
140
90
|
logger.post('tag', data)
|
141
|
-
wait_transfer
|
142
|
-
logger_data = queue.last.last
|
91
|
+
fluentd.wait_transfer
|
92
|
+
logger_data = fluentd.queue.last.last
|
143
93
|
expect(logger_data['time']).to eq '2008-09-01 10:05:00 UTC'
|
144
94
|
expect(logger_data['proc']).to be_truthy
|
145
95
|
expect(logger_data['object']).to be_truthy
|
@@ -153,8 +103,8 @@ EOF
|
|
153
103
|
'NaN' => (0.0/0.0) # JSON don't convert
|
154
104
|
}
|
155
105
|
logger.post('tag', data)
|
156
|
-
wait_transfer
|
157
|
-
expect(queue.last).to be_nil
|
106
|
+
fluentd.wait_transfer
|
107
|
+
expect(fluentd.queue.last).to be_nil
|
158
108
|
logger_io.rewind
|
159
109
|
logger_io.read =~ /FluentLogger: Can't convert to msgpack:/
|
160
110
|
}
|
@@ -174,21 +124,21 @@ EOF
|
|
174
124
|
|
175
125
|
context "initializer" do
|
176
126
|
it "backward compatible" do
|
177
|
-
fluent_logger = Fluent::Logger::FluentLogger.new('logger-test', 'localhost',
|
127
|
+
fluent_logger = Fluent::Logger::FluentLogger.new('logger-test', 'localhost', fluentd.port)
|
178
128
|
host, port = fluent_logger.instance_eval { [@host, @port] }
|
179
129
|
expect(host).to eq 'localhost'
|
180
|
-
expect(port).to eq
|
130
|
+
expect(port).to eq fluentd.port
|
181
131
|
end
|
182
132
|
|
183
133
|
it "hash argument" do
|
184
134
|
fluent_logger = Fluent::Logger::FluentLogger.new('logger-test', {
|
185
135
|
:host => 'localhost',
|
186
|
-
:port =>
|
136
|
+
:port => fluentd.port
|
187
137
|
})
|
188
138
|
|
189
139
|
host, port = fluent_logger.instance_eval { [@host, @port] }
|
190
140
|
expect(host).to eq 'localhost'
|
191
|
-
expect(port).to eq
|
141
|
+
expect(port).to eq fluentd.port
|
192
142
|
end
|
193
143
|
end
|
194
144
|
end
|
@@ -197,8 +147,8 @@ EOF
|
|
197
147
|
context('fluent logger interface') do
|
198
148
|
it ('post & close') {
|
199
149
|
expect(logger.post('tag', {'a' => 'b'})).to be false
|
200
|
-
wait_transfer # even if wait
|
201
|
-
expect(queue.last).to be_nil
|
150
|
+
fluentd.wait_transfer # even if wait
|
151
|
+
expect(fluentd.queue.last).to be_nil
|
202
152
|
logger.close
|
203
153
|
logger_io.rewind
|
204
154
|
log = logger_io.read
|
@@ -209,8 +159,8 @@ EOF
|
|
209
159
|
it ('post limit over') do
|
210
160
|
logger.limit = 100
|
211
161
|
logger.post('tag', {'a' => 'b'})
|
212
|
-
wait_transfer # even if wait
|
213
|
-
expect(queue.last).to be_nil
|
162
|
+
fluentd.wait_transfer # even if wait
|
163
|
+
expect(fluentd.queue.last).to be_nil
|
214
164
|
|
215
165
|
logger_io.rewind
|
216
166
|
expect(logger_io.read).not_to match /Can't send logs to/
|
@@ -226,9 +176,9 @@ EOF
|
|
226
176
|
expect_any_instance_of(Fluent::Logger::FluentLogger).to receive(:log_reconnect_error).once.and_call_original
|
227
177
|
|
228
178
|
logger.post('tag', {'a' => 'b'})
|
229
|
-
wait_transfer # even if wait
|
179
|
+
fluentd.wait_transfer # even if wait
|
230
180
|
logger.post('tag', {'a' => 'b'})
|
231
|
-
wait_transfer # even if wait
|
181
|
+
fluentd.wait_transfer # even if wait
|
232
182
|
logger_io.rewind
|
233
183
|
expect(logger_io.read).to match /Failed to connect/
|
234
184
|
end
|
@@ -253,8 +203,8 @@ EOF
|
|
253
203
|
logger.limit = 100
|
254
204
|
event_1 = {'a' => 'b'}
|
255
205
|
logger.post('tag', event_1)
|
256
|
-
wait_transfer # even if wait
|
257
|
-
expect(queue.last).to be(nil)
|
206
|
+
fluentd.wait_transfer # even if wait
|
207
|
+
expect(fluentd.queue.last).to be(nil)
|
258
208
|
|
259
209
|
logger_io.rewind
|
260
210
|
expect(logger_io.read).not_to match(/Can't send logs to/)
|
@@ -0,0 +1,165 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'support/dummy_serverengine'
|
4
|
+
require 'support/dummy_fluentd'
|
5
|
+
|
6
|
+
require 'logger'
|
7
|
+
require 'stringio'
|
8
|
+
|
9
|
+
describe Fluent::Logger::FluentLogger do
|
10
|
+
let(:fluentd) {
|
11
|
+
DummyFluentd.new
|
12
|
+
}
|
13
|
+
|
14
|
+
let(:level_logger) {
|
15
|
+
@logger_io = StringIO.new
|
16
|
+
logger = ::Logger.new(@logger_io)
|
17
|
+
Fluent::Logger::LevelFluentLogger.new('logger-test', {
|
18
|
+
:host => 'localhost',
|
19
|
+
:port => fluentd.port,
|
20
|
+
:logger => logger,
|
21
|
+
:buffer_overflow_handler => buffer_overflow_handler
|
22
|
+
})
|
23
|
+
}
|
24
|
+
|
25
|
+
let(:buffer_overflow_handler) { nil }
|
26
|
+
|
27
|
+
let(:logger_io) {
|
28
|
+
@logger_io
|
29
|
+
}
|
30
|
+
|
31
|
+
context "running fluentd" do
|
32
|
+
|
33
|
+
before(:all) do
|
34
|
+
@serverengine = DummyServerengine.new
|
35
|
+
@serverengine.startup
|
36
|
+
end
|
37
|
+
|
38
|
+
before(:each) do
|
39
|
+
fluentd.startup
|
40
|
+
end
|
41
|
+
|
42
|
+
after(:each) do
|
43
|
+
fluentd.shutdown
|
44
|
+
end
|
45
|
+
|
46
|
+
after(:all) do
|
47
|
+
@serverengine.shutdown
|
48
|
+
end
|
49
|
+
|
50
|
+
context('::Logger compatible methods') do
|
51
|
+
it ('initialize default value') {
|
52
|
+
level_fluent_logger = Fluent::Logger::LevelFluentLogger.new('logger-test', {
|
53
|
+
:host => 'localhost',
|
54
|
+
:port => fluentd.port,
|
55
|
+
:logger => ::Logger.new(StringIO.new),
|
56
|
+
:buffer_overflow_handler => buffer_overflow_handler
|
57
|
+
})
|
58
|
+
expect(level_fluent_logger.level).to eq 0
|
59
|
+
expect(level_fluent_logger.progname).to be_nil
|
60
|
+
}
|
61
|
+
|
62
|
+
it ('close') {
|
63
|
+
expect(level_logger).to be_connect
|
64
|
+
level_logger.close
|
65
|
+
expect(level_logger).not_to be_connect
|
66
|
+
}
|
67
|
+
|
68
|
+
it ('reopen') {
|
69
|
+
expect(level_logger).to be_connect
|
70
|
+
level_logger.reopen
|
71
|
+
expect(level_logger).not_to be_connect
|
72
|
+
expect(level_logger.info('logger reopen test')).to be true
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
context('add with level') do
|
77
|
+
it ('add progname') {
|
78
|
+
expect(level_logger.info('some_application'){ 'some application running' }).to be true
|
79
|
+
fluentd.wait_transfer
|
80
|
+
expect(fluentd.queue.last).to eq ['logger-test.info', {'level' => 'INFO', 'message' => 'some application running', 'progname' => 'some_application' }]
|
81
|
+
}
|
82
|
+
|
83
|
+
it ('send log debug') {
|
84
|
+
expect(level_logger.debug('some_application')).to be true
|
85
|
+
fluentd.wait_transfer
|
86
|
+
expect(fluentd.queue.last).to eq ['logger-test.debug', {'level' => 'DEBUG', 'message' => 'some_application' }]
|
87
|
+
}
|
88
|
+
|
89
|
+
it ('send log info') {
|
90
|
+
expect(level_logger.info('some_application')).to be true
|
91
|
+
fluentd.wait_transfer
|
92
|
+
expect(fluentd.queue.last).to eq ['logger-test.info', {'level' => 'INFO', 'message' => 'some_application' }]
|
93
|
+
}
|
94
|
+
|
95
|
+
it ('send log warn') {
|
96
|
+
expect(level_logger.warn('some_application')).to be true
|
97
|
+
fluentd.wait_transfer
|
98
|
+
expect(fluentd.queue.last).to eq ['logger-test.warn', {'level' => 'WARN', 'message' => 'some_application' }]
|
99
|
+
}
|
100
|
+
|
101
|
+
it ('send log error') {
|
102
|
+
expect(level_logger.error('some_application')).to be true
|
103
|
+
fluentd.wait_transfer
|
104
|
+
expect(fluentd.queue.last).to eq ['logger-test.error', {'level' => 'ERROR', 'message' => 'some_application' }]
|
105
|
+
}
|
106
|
+
|
107
|
+
it ('send log fatal') {
|
108
|
+
expect(level_logger.fatal('some_application')).to be true
|
109
|
+
fluentd.wait_transfer
|
110
|
+
expect(fluentd.queue.last).to eq ['logger-test.fatal', {'level' => 'FATAL', 'message' => 'some_application' }]
|
111
|
+
}
|
112
|
+
|
113
|
+
it ('not send log debug') {
|
114
|
+
level_logger.level = ::Logger::FATAL
|
115
|
+
|
116
|
+
expect(level_logger.debug('some_application')).to be true
|
117
|
+
fluentd.wait_transfer
|
118
|
+
expect(fluentd.queue).to eq []
|
119
|
+
}
|
120
|
+
|
121
|
+
it ('not send log info') {
|
122
|
+
level_logger.level = ::Logger::FATAL
|
123
|
+
|
124
|
+
expect(level_logger.info('some_application')).to be true
|
125
|
+
fluentd.wait_transfer
|
126
|
+
expect(fluentd.queue).to eq []
|
127
|
+
}
|
128
|
+
|
129
|
+
it ('not send log warn') {
|
130
|
+
level_logger.level = ::Logger::FATAL
|
131
|
+
|
132
|
+
expect(level_logger.warn('some_application')).to be true
|
133
|
+
fluentd.wait_transfer
|
134
|
+
expect(fluentd.queue).to eq []
|
135
|
+
}
|
136
|
+
|
137
|
+
it ('not send log error') {
|
138
|
+
level_logger.level = ::Logger::FATAL
|
139
|
+
|
140
|
+
expect(level_logger.error('some_application')).to be true
|
141
|
+
fluentd.wait_transfer
|
142
|
+
expect(fluentd.queue).to eq []
|
143
|
+
}
|
144
|
+
|
145
|
+
it ('define formatter') {
|
146
|
+
level_logger.level = ::Logger::DEBUG
|
147
|
+
level_logger.formatter = proc do |severity, datetime, progname, message|
|
148
|
+
map = { level: severity.class == Fixnum ? %w(DEBUG INFO WARN ERROR FATAL ANY)[severity] : severity }
|
149
|
+
map[:message] = message if message
|
150
|
+
map[:progname] = progname if progname
|
151
|
+
map[:stage] = "development"
|
152
|
+
map[:service_name] = "some service"
|
153
|
+
map
|
154
|
+
end
|
155
|
+
|
156
|
+
expect(level_logger.error('some_application')).to be true
|
157
|
+
fluentd.wait_transfer
|
158
|
+
expect(fluentd.queue.last).to eq [
|
159
|
+
'logger-test.error',
|
160
|
+
{'level' => 'ERROR', 'message' => 'some_application', 'stage' => 'development', 'service_name' => 'some service'}
|
161
|
+
]
|
162
|
+
}
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
data/spec/plugin/out_test.rb
CHANGED
@@ -14,11 +14,15 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
+
require 'fluent/output'
|
18
|
+
|
17
19
|
module Fluent
|
18
20
|
class TestOutput < Output
|
19
21
|
Plugin.register_output('test', self)
|
20
22
|
|
21
23
|
def initialize
|
24
|
+
super
|
25
|
+
|
22
26
|
@emit_streams = []
|
23
27
|
@name = nil
|
24
28
|
end
|
@@ -54,15 +58,19 @@ module Fluent
|
|
54
58
|
end
|
55
59
|
|
56
60
|
def configure(conf)
|
61
|
+
super
|
62
|
+
|
57
63
|
if name = conf['name']
|
58
64
|
@name = name
|
59
65
|
end
|
60
66
|
end
|
61
67
|
|
62
68
|
def start
|
69
|
+
super
|
63
70
|
end
|
64
71
|
|
65
72
|
def shutdown
|
73
|
+
super
|
66
74
|
end
|
67
75
|
|
68
76
|
def emit(tag, es, chain)
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'fluent/load'
|
2
|
+
require 'fluent/test'
|
3
|
+
require 'socket'
|
4
|
+
require 'plugin/out_test'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
class DummyFluentd
|
8
|
+
def initialize
|
9
|
+
output.emits.clear rescue nil
|
10
|
+
end
|
11
|
+
|
12
|
+
WAIT = ENV['WAIT'] ? ENV['WAIT'].to_f : 0.1
|
13
|
+
|
14
|
+
def wait_transfer
|
15
|
+
sleep WAIT
|
16
|
+
end
|
17
|
+
|
18
|
+
def port
|
19
|
+
return @port if @port
|
20
|
+
@port = 60001
|
21
|
+
loop do
|
22
|
+
begin
|
23
|
+
TCPServer.open('localhost', @port).close
|
24
|
+
break
|
25
|
+
rescue Errno::EADDRINUSE
|
26
|
+
@port += 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@port
|
30
|
+
end
|
31
|
+
|
32
|
+
def output
|
33
|
+
sleep 0.0001 # next tick
|
34
|
+
if Fluent::Engine.respond_to?(:match)
|
35
|
+
Fluent::Engine.match('logger-test').output
|
36
|
+
else
|
37
|
+
Fluent::Engine.root_agent.event_router.match('logger-test')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def queue
|
42
|
+
queue = []
|
43
|
+
output.emits.each {|tag, time, record|
|
44
|
+
queue << [tag, record]
|
45
|
+
}
|
46
|
+
queue
|
47
|
+
end
|
48
|
+
|
49
|
+
def startup
|
50
|
+
config = Fluent::Config.parse(<<EOF, '(logger-spec)', '(logger-spec-dir)', true)
|
51
|
+
<source>
|
52
|
+
type forward
|
53
|
+
port #{port}
|
54
|
+
</source>
|
55
|
+
<match logger-test.**>
|
56
|
+
type test
|
57
|
+
</match>
|
58
|
+
EOF
|
59
|
+
Fluent::Test.setup
|
60
|
+
Fluent::Engine.run_configure(config)
|
61
|
+
@coolio_default_loop = nil
|
62
|
+
@thread = Thread.new {
|
63
|
+
@coolio_default_loop = Coolio::Loop.default
|
64
|
+
Fluent::Engine.run
|
65
|
+
}
|
66
|
+
wait_transfer
|
67
|
+
end
|
68
|
+
|
69
|
+
def shutdown
|
70
|
+
@coolio_default_loop.stop rescue nil
|
71
|
+
begin
|
72
|
+
Fluent::Engine.stop
|
73
|
+
rescue => e
|
74
|
+
# for v0.12, calling stop may cause "loop not running" by internal default loop
|
75
|
+
if e.message == "loop not running"
|
76
|
+
Fluent::Engine.send :shutdown
|
77
|
+
end
|
78
|
+
end
|
79
|
+
@thread.join
|
80
|
+
@coolio_default_loop = @thread = nil
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class DummyServerengine
|
2
|
+
def initialize
|
3
|
+
end
|
4
|
+
|
5
|
+
def startup
|
6
|
+
@server = nil
|
7
|
+
if defined?(ServerEngine) # for v0.14. in_forward requires socket manager server
|
8
|
+
socket_manager_path = ServerEngine::SocketManager::Server.generate_path
|
9
|
+
@server = ServerEngine::SocketManager::Server.open(socket_manager_path)
|
10
|
+
ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
|
11
|
+
end
|
12
|
+
@server
|
13
|
+
end
|
14
|
+
|
15
|
+
def shutdown
|
16
|
+
@server.close if @server
|
17
|
+
end
|
18
|
+
end
|
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.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: 2016-
|
11
|
+
date: 2016-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- COPYING
|
115
115
|
- ChangeLog
|
116
116
|
- Gemfile
|
117
|
+
- Gemfile.v0.12
|
117
118
|
- README.md
|
118
119
|
- Rakefile
|
119
120
|
- VERSION
|
@@ -124,6 +125,7 @@ files:
|
|
124
125
|
- lib/fluent/logger/console_logger.rb
|
125
126
|
- lib/fluent/logger/fluent_logger.rb
|
126
127
|
- lib/fluent/logger/fluent_logger/cui.rb
|
128
|
+
- lib/fluent/logger/level_fluent_logger.rb
|
127
129
|
- lib/fluent/logger/logger_base.rb
|
128
130
|
- lib/fluent/logger/null_logger.rb
|
129
131
|
- lib/fluent/logger/test_logger.rb
|
@@ -131,11 +133,14 @@ files:
|
|
131
133
|
- lib/fluent/logger/version.rb
|
132
134
|
- spec/console_logger_spec.rb
|
133
135
|
- spec/fluent_logger_spec.rb
|
136
|
+
- spec/level_fluent_logger_spec.rb
|
134
137
|
- spec/logger_base_spec.rb
|
135
138
|
- spec/logger_spec.rb
|
136
139
|
- spec/null_logger_spec.rb
|
137
140
|
- spec/plugin/out_test.rb
|
138
141
|
- spec/spec_helper.rb
|
142
|
+
- spec/support/dummy_fluentd.rb
|
143
|
+
- spec/support/dummy_serverengine.rb
|
139
144
|
- spec/support/timecop.rb
|
140
145
|
- spec/test_logger_spec.rb
|
141
146
|
homepage: https://github.com/fluent/fluent-logger-ruby
|
@@ -164,10 +169,13 @@ summary: fluent logger for ruby
|
|
164
169
|
test_files:
|
165
170
|
- spec/console_logger_spec.rb
|
166
171
|
- spec/fluent_logger_spec.rb
|
172
|
+
- spec/level_fluent_logger_spec.rb
|
167
173
|
- spec/logger_base_spec.rb
|
168
174
|
- spec/logger_spec.rb
|
169
175
|
- spec/null_logger_spec.rb
|
170
176
|
- spec/plugin/out_test.rb
|
171
177
|
- spec/spec_helper.rb
|
178
|
+
- spec/support/dummy_fluentd.rb
|
179
|
+
- spec/support/dummy_serverengine.rb
|
172
180
|
- spec/support/timecop.rb
|
173
181
|
- spec/test_logger_spec.rb
|