fluentd 0.10.43 → 0.10.44
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- data/.travis.yml +7 -2
- data/ChangeLog +10 -1
- data/Gemfile.cool.io.1.1.1 +4 -0
- data/README.md +39 -0
- data/fluentd.gemspec +10 -10
- data/lib/fluent/command/bundler_injection.rb +31 -0
- data/lib/fluent/command/debug.rb +7 -0
- data/lib/fluent/command/fluentd.rb +24 -2
- data/lib/fluent/config.rb +7 -4
- data/lib/fluent/config_dsl.rb +18 -0
- data/lib/fluent/plugin/in_forward.rb +7 -2
- data/lib/fluent/plugin/in_stream.rb +4 -1
- data/lib/fluent/plugin/out_stream.rb +1 -1
- data/lib/fluent/version.rb +1 -1
- data/test/config.rb +48 -7
- data/test/configdsl.rb +41 -0
- metadata +20 -6
- data/README.rdoc +0 -69
data/.travis.yml
CHANGED
@@ -3,15 +3,20 @@ language: ruby
|
|
3
3
|
rvm:
|
4
4
|
- 1.9.3
|
5
5
|
- 2.0.0
|
6
|
-
-
|
6
|
+
- 2.1.0
|
7
|
+
- rbx
|
7
8
|
|
8
9
|
branches:
|
9
10
|
only:
|
10
11
|
- master
|
11
12
|
- v11
|
12
13
|
|
14
|
+
gemfile:
|
15
|
+
- Gemfile
|
16
|
+
- Gemfile.cool.io.1.1.1
|
17
|
+
|
13
18
|
script: bundle exec rake
|
14
19
|
|
15
20
|
matrix:
|
16
21
|
allow_failures:
|
17
|
-
- rvm: rbx
|
22
|
+
- rvm: rbx
|
data/ChangeLog
CHANGED
@@ -1,4 +1,13 @@
|
|
1
|
-
Release 0.10.
|
1
|
+
Release 0.10.44 - 2014/02/26
|
2
|
+
|
3
|
+
* in_forward: Print remote address and port in trace log
|
4
|
+
* Remove several methods from fluentd-debug to call remote object method directly
|
5
|
+
* Add --gemfile option to manage Fluentd and plugins using Gemfile and Bundler
|
6
|
+
* Add <include path /> directive to include the configuration file under the elements
|
7
|
+
* Add 'ruby' keyword to call Kernel method in configuration DSL
|
8
|
+
* Relax Cool.io gem version to allow 1.2.x
|
9
|
+
|
10
|
+
Release 0.10.43 - 2014/02/03
|
2
11
|
|
3
12
|
* Input/Output: Add 'log_level' option to plugins
|
4
13
|
* parser/in_tail: Fix RegexpParser forget to call configure method
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Fluentd: Open-Source Data Collector
|
2
|
+
===================================
|
3
|
+
|
4
|
+
[<img src="https://travis-ci.org/fluent/fluentd.png" />](https://travis-ci.org/fluent/fluentd) [<img src="https://codeclimate.com/github/fluent/fluentd.png " />](https://codeclimate.com/github/fluent/fluentd)
|
5
|
+
|
6
|
+
|
7
|
+
[Fluentd](http://fluentd.org/) collects events from various data sources and writes them to files, database or other types of storages. You can simplify your data stream, and have robust data collection mechanism instantly:
|
8
|
+
|
9
|
+
<p align="center">
|
10
|
+
<img src="http://docs.fluentd.org/images/fluentd-architecture.png" width="500px"/>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
An event consists of *tag*, *time* and *record*. Tag is a string separated with '.' (e.g. myapp.access). It is used to categorize events. Time is a UNIX time recorded at occurrence of an event. Record is a JSON object.
|
14
|
+
|
15
|
+
|
16
|
+
## Quick Start
|
17
|
+
|
18
|
+
$ gem install fluentd
|
19
|
+
$ fluentd -s conf
|
20
|
+
$ fluentd -c conf/fluent.conf &
|
21
|
+
$ echo '{"json":"message"}' | fluent-cat debug.test
|
22
|
+
|
23
|
+
## More Information
|
24
|
+
|
25
|
+
- Web site: http://fluentd.org/
|
26
|
+
- Documents: http://docs.fluentd.org/
|
27
|
+
- Source repository: http://github.com/fluent
|
28
|
+
- Discussion: http://groups.google.com/group/fluentd
|
29
|
+
- News Letters: http://go.treasuredata.com/Fluentd_education
|
30
|
+
- Author: Sadayuki Furuhashi
|
31
|
+
- Copyright: (c) 2011 FURUHASHI Sadayuki
|
32
|
+
- License: Apache License, Version 2.0
|
33
|
+
|
34
|
+
## Contributors:
|
35
|
+
|
36
|
+
Patches contributed by [great developers](https://github.com/fluent/fluentd/contributors).
|
37
|
+
|
38
|
+
[<img src="https://ga-beacon.appspot.com/UA-24890265-6/fluent/fluentd" />](https://github.com/fluent/fluentd)
|
39
|
+
|
data/fluentd.gemspec
CHANGED
@@ -18,15 +18,15 @@ Gem::Specification.new do |gem|
|
|
18
18
|
|
19
19
|
gem.required_ruby_version = '>= 1.9.2'
|
20
20
|
|
21
|
-
gem.add_runtime_dependency(
|
22
|
-
gem.add_runtime_dependency(
|
23
|
-
gem.add_runtime_dependency(
|
24
|
-
gem.add_runtime_dependency(
|
25
|
-
gem.add_runtime_dependency(
|
26
|
-
gem.add_runtime_dependency(
|
21
|
+
gem.add_runtime_dependency("msgpack", [">= 0.4.4", "!= 0.5.0", "!= 0.5.1", "!= 0.5.2", "!= 0.5.3", "< 0.6.0"])
|
22
|
+
gem.add_runtime_dependency("json", [">= 1.4.3"])
|
23
|
+
gem.add_runtime_dependency("yajl-ruby", ["~> 1.0"])
|
24
|
+
gem.add_runtime_dependency("cool.io", [">= 1.1.1", "!= 1.2.0", "< 2.0.0"])
|
25
|
+
gem.add_runtime_dependency("http_parser.rb", ["~> 0.5.1"])
|
26
|
+
gem.add_runtime_dependency("sigdump", ["~> 0.2.2"])
|
27
27
|
|
28
|
-
gem.add_development_dependency(
|
29
|
-
gem.add_development_dependency(
|
30
|
-
gem.add_development_dependency(
|
31
|
-
gem.add_development_dependency(
|
28
|
+
gem.add_development_dependency("rake", [">= 0.9.2"])
|
29
|
+
gem.add_development_dependency("parallel_tests", [">= 0.15.3"])
|
30
|
+
gem.add_development_dependency("rr", [">= 1.0.0"])
|
31
|
+
gem.add_development_dependency("timecop", [">= 0.3.0"])
|
32
32
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
system("bundle install")
|
18
|
+
unless $?.success?
|
19
|
+
exit $?.exitstatus
|
20
|
+
end
|
21
|
+
|
22
|
+
cmdline = [
|
23
|
+
'bundle',
|
24
|
+
'exec',
|
25
|
+
RbConfig.ruby,
|
26
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'fluentd.rb')),
|
27
|
+
] + ARGV
|
28
|
+
|
29
|
+
exec *cmdline
|
30
|
+
exit! 127
|
31
|
+
|
data/lib/fluent/command/debug.rb
CHANGED
@@ -59,6 +59,13 @@ require 'fluent/load'
|
|
59
59
|
$log = Fluent::Log.new(STDERR, Fluent::Log::LEVEL_TRACE)
|
60
60
|
Fluent::Engine.init
|
61
61
|
|
62
|
+
DRb::DRbObject.class_eval do
|
63
|
+
undef_method :methods
|
64
|
+
undef_method :instance_eval
|
65
|
+
undef_method :instance_variables
|
66
|
+
undef_method :instance_variable_get
|
67
|
+
end
|
68
|
+
|
62
69
|
remote_engine = DRb::DRbObject.new_with_uri(uri)
|
63
70
|
|
64
71
|
Fluent.module_eval do
|
@@ -107,6 +107,14 @@ op.on('--suppress-config-dump', "suppress config dumping when fluentd starts", T
|
|
107
107
|
opts[:suppress_config_dump] = b
|
108
108
|
}
|
109
109
|
|
110
|
+
op.on('-g', '--gemfile GEMFILE', "Gemfile path") {|s|
|
111
|
+
opts[:gemfile] = s
|
112
|
+
}
|
113
|
+
|
114
|
+
op.on('-G', '--gem-path GEM_INSTALL_PATH', "Gemfile install path (default: $(dirname $gemfile)/vendor/bundle)") {|s|
|
115
|
+
opts[:gem_install_path] = s
|
116
|
+
}
|
117
|
+
|
110
118
|
(class<<self;self;end).module_eval do
|
111
119
|
define_method(:usage) do |msg|
|
112
120
|
puts op.to_s
|
@@ -116,9 +124,9 @@ op.on('--suppress-config-dump', "suppress config dumping when fluentd starts", T
|
|
116
124
|
end
|
117
125
|
|
118
126
|
begin
|
119
|
-
op.parse
|
127
|
+
rest = op.parse(ARGV)
|
120
128
|
|
121
|
-
if
|
129
|
+
if rest.length != 0
|
122
130
|
usage nil
|
123
131
|
end
|
124
132
|
rescue
|
@@ -126,6 +134,20 @@ rescue
|
|
126
134
|
end
|
127
135
|
|
128
136
|
|
137
|
+
##
|
138
|
+
## Bundler injection
|
139
|
+
#
|
140
|
+
if ENV['FLUENTD_DISABLE_BUNDLER_INJECTION'] != '1' && gemfile = opts[:gemfile]
|
141
|
+
ENV['BUNDLE_GEMFILE'] = gemfile
|
142
|
+
if path = opts[:gem_install_path]
|
143
|
+
ENV['BUNDLE_PATH'] = path
|
144
|
+
else
|
145
|
+
ENV['BUNDLE_PATH'] = File.expand_path(File.join(File.dirname(gemfile), 'vendor/bundle'))
|
146
|
+
end
|
147
|
+
ENV['FLUENTD_DISABLE_BUNDLER_INJECTION'] = '1'
|
148
|
+
load File.expand_path(File.join(File.dirname(__FILE__), 'bundler_injection.rb'))
|
149
|
+
end
|
150
|
+
|
129
151
|
if setup_path = opts[:setup_path]
|
130
152
|
require 'fileutils'
|
131
153
|
FileUtils.mkdir_p File.join(setup_path, "plugin")
|
data/lib/fluent/config.rb
CHANGED
@@ -171,6 +171,9 @@ module Fluent
|
|
171
171
|
line.gsub!(/\s*(?:\#.*)?$/,'')
|
172
172
|
if line.empty?
|
173
173
|
next
|
174
|
+
elsif m = /^\<include\s*(.*)\s*\/\>$/.match(line)
|
175
|
+
value = m[1].strip
|
176
|
+
process_include(attrs, elems, value, allow_include)
|
174
177
|
elsif m = /^\<([a-zA-Z0-9_]+)\s*(.+?)?\>$/.match(line)
|
175
178
|
e_name = m[1]
|
176
179
|
e_arg = m[2] || ""
|
@@ -197,7 +200,7 @@ module Fluent
|
|
197
200
|
return attrs, elems
|
198
201
|
end
|
199
202
|
|
200
|
-
def process_include(attrs, elems, uri)
|
203
|
+
def process_include(attrs, elems, uri, allow_include = true)
|
201
204
|
u = URI.parse(uri)
|
202
205
|
if u.scheme == 'file' || u.path == uri # file path
|
203
206
|
path = u.path
|
@@ -207,11 +210,11 @@ module Fluent
|
|
207
210
|
pattern = path
|
208
211
|
end
|
209
212
|
|
210
|
-
Dir.glob(pattern).each {|path|
|
213
|
+
Dir.glob(pattern).sort.each {|path|
|
211
214
|
basepath = File.dirname(path)
|
212
215
|
fname = File.basename(path)
|
213
216
|
File.open(path) {|f|
|
214
|
-
Parser.new(basepath, f.each_line, fname).parse!(
|
217
|
+
Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
|
215
218
|
}
|
216
219
|
}
|
217
220
|
|
@@ -220,7 +223,7 @@ module Fluent
|
|
220
223
|
fname = path
|
221
224
|
require 'open-uri'
|
222
225
|
open(uri) {|f|
|
223
|
-
Parser.new(basepath, f.each_line, fname).parse!(
|
226
|
+
Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
|
224
227
|
}
|
225
228
|
end
|
226
229
|
|
data/lib/fluent/config_dsl.rb
CHANGED
@@ -81,6 +81,24 @@ module Fluent
|
|
81
81
|
::Kernel.raise ::ArgumentError, "#{name} block requires arguments for match pattern" if args.nil? || args.size != 1
|
82
82
|
@proxy.add_element('match', args.first, block)
|
83
83
|
end
|
84
|
+
|
85
|
+
def self.const_missing(name)
|
86
|
+
return ::Kernel.const_get(name) if ::Kernel.const_defined?(name)
|
87
|
+
|
88
|
+
if name.to_s =~ /^Fluent::Config::DSL::Element::(.*)$/
|
89
|
+
name = "#{$1}".to_sym
|
90
|
+
return ::Kernel.const_get(name) if ::Kernel.const_defined?(name)
|
91
|
+
end
|
92
|
+
::Kernel.eval("#{name}")
|
93
|
+
end
|
94
|
+
|
95
|
+
def ruby(&block)
|
96
|
+
if block
|
97
|
+
@proxy.instance_exec(&block)
|
98
|
+
else
|
99
|
+
::Kernel
|
100
|
+
end
|
101
|
+
end
|
84
102
|
end
|
85
103
|
end
|
86
104
|
end
|
@@ -55,7 +55,9 @@ module Fluent
|
|
55
55
|
@loop.stop
|
56
56
|
@usock.close
|
57
57
|
listen_address = (@bind == '0.0.0.0' ? '127.0.0.1' : @bind)
|
58
|
-
|
58
|
+
# This line is for connecting listen socket to stop the event loop.
|
59
|
+
# We should use more better approach, e.g. using pipe, fixing cool.io with timeout, etc.
|
60
|
+
TCPSocket.open(listen_address, @port) {|sock| } # FIXME @thread.join blocks without this line
|
59
61
|
@thread.join
|
60
62
|
@lsock.close
|
61
63
|
end
|
@@ -151,7 +153,10 @@ module Fluent
|
|
151
153
|
end
|
152
154
|
@on_message = on_message
|
153
155
|
@log = log
|
154
|
-
@log.trace {
|
156
|
+
@log.trace {
|
157
|
+
remote_port, remote_addr = *Socket.unpack_sockaddr_in(@_io.getpeername) rescue nil
|
158
|
+
"accepted fluent socket from '#{remote_addr}:#{remote_port}': object_id=#{self.object_id}"
|
159
|
+
}
|
155
160
|
end
|
156
161
|
|
157
162
|
def on_connect
|
@@ -112,7 +112,10 @@ module Fluent
|
|
112
112
|
end
|
113
113
|
@on_message = on_message
|
114
114
|
@log = log
|
115
|
-
@log.trace {
|
115
|
+
@log.trace {
|
116
|
+
remote_port, remote_addr = *Socket.unpack_sockaddr_in(@_io.getpeername) rescue nil
|
117
|
+
"accepted fluent socket from '#{remote_addr}:#{remote_port}': object_id=#{self.object_id}"
|
118
|
+
}
|
116
119
|
end
|
117
120
|
|
118
121
|
def on_connect
|
@@ -89,7 +89,7 @@ module Fluent
|
|
89
89
|
def initialize
|
90
90
|
super
|
91
91
|
$log.warn "'tcp' output is obsoleted and will be removed. Use 'forward' instead."
|
92
|
-
$log.warn "see 'forward' section in http://fluentd.org/
|
92
|
+
$log.warn "see 'forward' section in http://docs.fluentd.org/ for the high-availability configuration."
|
93
93
|
end
|
94
94
|
|
95
95
|
config_param :port, :integer, :default => DEFAULT_LISTEN_PORT
|
data/lib/fluent/version.rb
CHANGED
data/test/config.rb
CHANGED
@@ -15,7 +15,7 @@ class ConfigTest < Test::Unit::TestCase
|
|
15
15
|
include dir/config_test_2.conf #
|
16
16
|
include #{TMP_DIR}/config_test_4.conf
|
17
17
|
include file://#{TMP_DIR}/config_test_5.conf
|
18
|
-
include config.d/*.conf
|
18
|
+
<include config.d/*.conf />
|
19
19
|
]
|
20
20
|
write_config "#{TMP_DIR}/dir/config_test_2.conf", %[
|
21
21
|
k2 relative_path_include
|
@@ -32,13 +32,31 @@ class ConfigTest < Test::Unit::TestCase
|
|
32
32
|
]
|
33
33
|
write_config "#{TMP_DIR}/config.d/config_test_6.conf", %[
|
34
34
|
k6 wildcard_include_1
|
35
|
-
<
|
35
|
+
<elem1 name>
|
36
36
|
include normal_parameter
|
37
|
-
</
|
37
|
+
</elem1>
|
38
38
|
]
|
39
39
|
write_config "#{TMP_DIR}/config.d/config_test_7.conf", %[
|
40
40
|
k7 wildcard_include_2
|
41
41
|
]
|
42
|
+
write_config "#{TMP_DIR}/config.d/config_test_8.conf", %[
|
43
|
+
<elem2 name>
|
44
|
+
<include ../dir/config_test_9.conf />
|
45
|
+
</elem2>
|
46
|
+
]
|
47
|
+
write_config "#{TMP_DIR}/dir/config_test_9.conf", %[
|
48
|
+
k9 embeded
|
49
|
+
<elem3 name>
|
50
|
+
nested nested_value
|
51
|
+
include hoge
|
52
|
+
</elem3>
|
53
|
+
]
|
54
|
+
write_config "#{TMP_DIR}/config.d/00_config_test_8.conf", %[
|
55
|
+
k8 wildcard_include_3
|
56
|
+
<elem4 name>
|
57
|
+
include normal_parameter
|
58
|
+
</elem4>
|
59
|
+
]
|
42
60
|
|
43
61
|
end
|
44
62
|
|
@@ -52,10 +70,33 @@ class ConfigTest < Test::Unit::TestCase
|
|
52
70
|
assert_equal 'uri_include', c['k5']
|
53
71
|
assert_equal 'wildcard_include_1', c['k6']
|
54
72
|
assert_equal 'wildcard_include_2', c['k7']
|
55
|
-
assert_equal '
|
56
|
-
assert_equal
|
57
|
-
|
58
|
-
|
73
|
+
assert_equal 'wildcard_include_3', c['k8']
|
74
|
+
assert_equal [
|
75
|
+
'k1',
|
76
|
+
'k2',
|
77
|
+
'k3',
|
78
|
+
'k4',
|
79
|
+
'k5',
|
80
|
+
'k8', # Because of the file name this comes first.
|
81
|
+
'k6',
|
82
|
+
'k7',
|
83
|
+
], c.keys
|
84
|
+
|
85
|
+
elem1 = c.elements.find { |e| e.name == 'elem1' }
|
86
|
+
assert_not_nil elem1
|
87
|
+
assert_equal 'name', elem1.arg
|
88
|
+
assert_equal 'normal_parameter', elem1['include']
|
89
|
+
|
90
|
+
elem2 = c.elements.find { |e| e.name == 'elem2' }
|
91
|
+
assert_not_nil elem2
|
92
|
+
assert_equal 'name', elem2.arg
|
93
|
+
assert_equal 'embeded', elem2['k9']
|
94
|
+
assert !elem2.has_key?('include')
|
95
|
+
|
96
|
+
elem3 = elem2.elements.find { |e| e.name == 'elem3' }
|
97
|
+
assert_not_nil elem3
|
98
|
+
assert_equal 'nested_value', elem3['nested']
|
99
|
+
assert_equal 'hoge', elem3['include']
|
59
100
|
end
|
60
101
|
|
61
102
|
def test_check_not_fetchd
|
data/test/configdsl.rb
CHANGED
@@ -104,4 +104,45 @@ match('aa')
|
|
104
104
|
Fluent::Config::DSL::Parser.parse(TEST_DSL_CONFIG5)
|
105
105
|
}
|
106
106
|
end
|
107
|
+
|
108
|
+
def test_with_ruby_keyword
|
109
|
+
uname_string = `uname -a`
|
110
|
+
root1 = Fluent::Config::DSL::Parser.parse(<<DSL)
|
111
|
+
uname_str = ruby.open('|uname -a'){|out| out.read}
|
112
|
+
source {
|
113
|
+
uname uname_str
|
114
|
+
}
|
115
|
+
DSL
|
116
|
+
source1 = root1.elements.first
|
117
|
+
assert_equal 'source', source1.name
|
118
|
+
assert_equal 1, source1.keys.size
|
119
|
+
assert_equal uname_string, source1['uname']
|
120
|
+
|
121
|
+
root2 = Fluent::Config::DSL::Parser.parse(<<DSL)
|
122
|
+
ruby_version = ruby {
|
123
|
+
require 'erb'
|
124
|
+
ERB.new('<%= RUBY_VERSION %> from erb').result
|
125
|
+
}
|
126
|
+
source {
|
127
|
+
version ruby_version
|
128
|
+
}
|
129
|
+
DSL
|
130
|
+
source2 = root2.elements.first
|
131
|
+
assert_equal 'source', source2.name
|
132
|
+
assert_equal 1, source2.keys.size
|
133
|
+
assert_equal "#{RUBY_VERSION} from erb", source2['version']
|
134
|
+
|
135
|
+
# Parser#parse raises NoMethodError when configuration dsl elements are written in ruby block
|
136
|
+
conf3 = <<DSL
|
137
|
+
ruby {
|
138
|
+
source {
|
139
|
+
type "tail"
|
140
|
+
}
|
141
|
+
}
|
142
|
+
source {
|
143
|
+
uname uname_str
|
144
|
+
}
|
145
|
+
DSL
|
146
|
+
assert_raise (NoMethodError) { Fluent::Config::DSL::Parser.parse(conf3) }
|
147
|
+
end
|
107
148
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluentd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.44
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: msgpack
|
@@ -94,17 +94,29 @@ dependencies:
|
|
94
94
|
requirement: !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
|
-
- -
|
97
|
+
- - ! '>='
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: 1.1.1
|
100
|
+
- - ! '!='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.2.0
|
103
|
+
- - <
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 2.0.0
|
100
106
|
type: :runtime
|
101
107
|
prerelease: false
|
102
108
|
version_requirements: !ruby/object:Gem::Requirement
|
103
109
|
none: false
|
104
110
|
requirements:
|
105
|
-
- -
|
111
|
+
- - ! '>='
|
106
112
|
- !ruby/object:Gem::Version
|
107
113
|
version: 1.1.1
|
114
|
+
- - ! '!='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 1.2.0
|
117
|
+
- - <
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 2.0.0
|
108
120
|
- !ruby/object:Gem::Dependency
|
109
121
|
name: http_parser.rb
|
110
122
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,7 +232,8 @@ files:
|
|
220
232
|
- COPYING
|
221
233
|
- ChangeLog
|
222
234
|
- Gemfile
|
223
|
-
-
|
235
|
+
- Gemfile.cool.io.1.1.1
|
236
|
+
- README.md
|
224
237
|
- Rakefile
|
225
238
|
- bin/fluent-cat
|
226
239
|
- bin/fluent-debug
|
@@ -229,6 +242,7 @@ files:
|
|
229
242
|
- fluent.conf
|
230
243
|
- fluentd.gemspec
|
231
244
|
- lib/fluent/buffer.rb
|
245
|
+
- lib/fluent/command/bundler_injection.rb
|
232
246
|
- lib/fluent/command/cat.rb
|
233
247
|
- lib/fluent/command/debug.rb
|
234
248
|
- lib/fluent/command/fluentd.rb
|
@@ -324,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
338
|
version: '0'
|
325
339
|
segments:
|
326
340
|
- 0
|
327
|
-
hash: -
|
341
|
+
hash: -3906480416745103078
|
328
342
|
requirements: []
|
329
343
|
rubyforge_project:
|
330
344
|
rubygems_version: 1.8.23
|
data/README.rdoc
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
= Fluentd
|
2
|
-
|
3
|
-
{<img src="https://travis-ci.org/fluent/fluentd.png" />}[https://travis-ci.org/fluent/fluentd] {<img src="https://codeclimate.com/github/fluent/fluentd.png " />}[https://codeclimate.com/github/fluent/fluentd]
|
4
|
-
|
5
|
-
Fluentd is an event collector system. It is a generalized version of syslogd, which handles JSON objects for its log messages.
|
6
|
-
|
7
|
-
== Architecture
|
8
|
-
|
9
|
-
Fluentd collects events from various data sources and writes them to files, database or other types of storages:
|
10
|
-
|
11
|
-
|
12
|
-
Web apps ---+ +--> file
|
13
|
-
| |
|
14
|
-
+--> ---+
|
15
|
-
/var/log ------> Fluentd ------> mail
|
16
|
-
+--> ---+
|
17
|
-
| |
|
18
|
-
Apache ---- +--> Fluentd
|
19
|
-
|
20
|
-
|
21
|
-
Fluent also supports log transfer:
|
22
|
-
|
23
|
-
|
24
|
-
Web server
|
25
|
-
+---------+
|
26
|
-
| Fluentd -------
|
27
|
-
+---------+| |
|
28
|
-
+---------+ |
|
29
|
-
|
|
30
|
-
Proxy server | Log server, Amazon S3, HDFS, ...
|
31
|
-
+---------+ +--> +---------+
|
32
|
-
| Fluentd ----------> | Fluentd ||
|
33
|
-
+---------+| +--> +---------+|
|
34
|
-
+---------+ | +---------+
|
35
|
-
|
|
36
|
-
Database server |
|
37
|
-
+---------+ |
|
38
|
-
| Fluentd ---------> mail
|
39
|
-
+---------+|
|
40
|
-
+---------+
|
41
|
-
|
42
|
-
|
43
|
-
An event consists of *tag*, *time* and *record*. Tag is a string separated with '.' (e.g. myapp.access). It is used to categorize events. Time is a UNIX time recorded at occurrence of an event. Record is a JSON object.
|
44
|
-
|
45
|
-
|
46
|
-
== Quick Start
|
47
|
-
|
48
|
-
$ gem install fluentd
|
49
|
-
$ # install sample configuration file to the directory
|
50
|
-
$ fluentd -s conf
|
51
|
-
$ fluentd -c conf/fluent.conf &
|
52
|
-
$ echo '{"json":"message"}' | fluent-cat debug.test
|
53
|
-
|
54
|
-
== Meta
|
55
|
-
|
56
|
-
Web site:: http://fluentd.org/
|
57
|
-
Documents:: http://docs.fluentd.org/
|
58
|
-
Source repository:: http://github.com/fluent
|
59
|
-
Discussion:: http://groups.google.com/group/fluentd
|
60
|
-
Author:: Sadayuki Furuhashi
|
61
|
-
Copyright:: (c) 2011 FURUHASHI Sadayuki
|
62
|
-
License:: Apache License, Version 2.0
|
63
|
-
|
64
|
-
== Contributors:
|
65
|
-
|
66
|
-
Patches contributed by {those people}[https://github.com/fluent/fluentd/contributors].
|
67
|
-
|
68
|
-
{<img src="https://ga-beacon.appspot.com/UA-24890265-6/fluent/fluentd" />}[https://github.com/fluent/fluentd]
|
69
|
-
|