fluent-plugin-s3 0.2.0 → 0.2.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.
- data/ChangeLog +7 -0
- data/Gemfile +3 -0
- data/README.rdoc +53 -0
- data/Rakefile +8 -54
- data/VERSION +1 -1
- data/fluent-plugin-s3.gemspec +21 -0
- data/lib/fluent/plugin/out_s3.rb +16 -41
- metadata +44 -67
data/ChangeLog
CHANGED
data/Gemfile
ADDED
data/README.rdoc
CHANGED
@@ -1,2 +1,55 @@
|
|
1
1
|
= Amazon S3 output plugin for Fluent event collector
|
2
2
|
|
3
|
+
== Overview
|
4
|
+
|
5
|
+
*s3* output plugin buffers event logs in local file and upload it to S3 periodically.
|
6
|
+
|
7
|
+
This plugin splits files exactly by using the time of event logs (not the time when the logs are received). For example, a log '2011-01-02 message B' is reached, and then another log '2011-01-03 message B' is reached in this order, the former one is stored in "20110102.gz" file, and latter one in "20110103.gz" file.
|
8
|
+
|
9
|
+
|
10
|
+
== Installation
|
11
|
+
|
12
|
+
Simply use RubyGems:
|
13
|
+
|
14
|
+
gem install fluent-plugin-s3
|
15
|
+
|
16
|
+
== Configuration
|
17
|
+
|
18
|
+
<match pattern>
|
19
|
+
type s3
|
20
|
+
|
21
|
+
aws_key_id YOUR_AWS_KEY_ID
|
22
|
+
aws_sec_key YOUR_AWS_SECRET/KEY
|
23
|
+
s3_bucket YOUR_S3_BUCKET_NAME
|
24
|
+
path logs/
|
25
|
+
buffer_path /var/log/fluent/s3
|
26
|
+
|
27
|
+
time_slice_format %Y%m%d-%H
|
28
|
+
time_slice_wait 10m
|
29
|
+
utc
|
30
|
+
</match>
|
31
|
+
|
32
|
+
[aws_key_id (required)] AWS access key id.
|
33
|
+
|
34
|
+
[aws_sec_key (required)] AWS secret key.
|
35
|
+
|
36
|
+
[s3_bucket (required)] S3 bucket name.
|
37
|
+
|
38
|
+
[path] path prefix of the files on S3. Default is "" (no prefix).
|
39
|
+
|
40
|
+
[buffer_path (required)] path prefix of the files to buffer logs.
|
41
|
+
|
42
|
+
[time_slice_format] Format of the time used as the file name. Default is '%Y%m%d'. Use '%Y%m%d%H' to split files hourly.
|
43
|
+
|
44
|
+
[time_slice_wait] The time to wait old logs. Default is 10 minutes. Specify larger value if old logs may reache.
|
45
|
+
|
46
|
+
[utc] Use UTC instead of local time.
|
47
|
+
|
48
|
+
The actual path on S3 will be: "{path}{time_slice_format}_{sequential_number}.gz"
|
49
|
+
|
50
|
+
|
51
|
+
== Copyright
|
52
|
+
|
53
|
+
Copyright:: Copyright (c) 2011 Sadayuki Furuhashi
|
54
|
+
License:: Apache License, Version 2.0
|
55
|
+
|
data/Rakefile
CHANGED
@@ -1,60 +1,14 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/clean'
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'jeweler'
|
7
|
-
Jeweler::Tasks.new do |gemspec|
|
8
|
-
gemspec.name = "fluent-plugin-s3"
|
9
|
-
gemspec.summary = "Amazon S3 output plugin for Fluent event collector"
|
10
|
-
gemspec.author = "Sadayuki Furuhashi"
|
11
|
-
gemspec.email = "frsyuki@gmail.com"
|
12
|
-
gemspec.homepage = "http://fluent.github.com/"
|
13
|
-
gemspec.has_rdoc = false
|
14
|
-
gemspec.require_paths = ["lib"]
|
15
|
-
gemspec.add_dependency "fluentd", "~> 0.10.0"
|
16
|
-
gemspec.add_dependency "aws-sdk", "~> 1.1.3"
|
17
|
-
gemspec.test_files = Dir["test/**/*.rb"]
|
18
|
-
gemspec.files = Dir["bin/**/*", "lib/**/*", "test/**/*.rb"] +
|
19
|
-
%w[VERSION AUTHORS Rakefile]
|
20
|
-
gemspec.executables = []
|
21
|
-
end
|
22
|
-
Jeweler::GemcutterTasks.new
|
23
|
-
rescue LoadError
|
24
|
-
puts "Jeweler not available. Install it with: gem install jeweler"
|
25
|
-
end
|
26
|
-
|
27
|
-
Rake::TestTask.new(:test) do |t|
|
28
|
-
t.test_files = Dir['test/*_test.rb']
|
29
|
-
t.ruby_opts = ['-rubygems'] if defined? Gem
|
30
|
-
t.ruby_opts << '-I.'
|
31
|
-
end
|
32
1
|
|
33
|
-
|
34
|
-
|
35
|
-
#file VERSION_FILE => ["VERSION"] do |t|
|
36
|
-
# version = File.read("VERSION").strip
|
37
|
-
# File.open(VERSION_FILE, "w") {|f|
|
38
|
-
# f.write <<EOF
|
39
|
-
#module Fluent
|
40
|
-
#
|
41
|
-
#VERSION = '#{version}'
|
42
|
-
#
|
43
|
-
#end
|
44
|
-
#EOF
|
45
|
-
# }
|
46
|
-
#end
|
47
|
-
#
|
48
|
-
#task :default => [VERSION_FILE, :build]
|
2
|
+
require 'bundler'
|
3
|
+
Bundler::GemHelper.install_tasks
|
49
4
|
|
50
|
-
|
5
|
+
require 'rake/testtask'
|
51
6
|
|
52
|
-
Rake::TestTask.new(:test) do |
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
#t.warning = true
|
7
|
+
Rake::TestTask.new(:test) do |test|
|
8
|
+
test.libs << 'lib' << 'test'
|
9
|
+
test.test_files = FileList['test/*.rb']
|
10
|
+
test.verbose = true
|
57
11
|
end
|
58
12
|
|
59
|
-
task :default => [:build
|
13
|
+
task :default => [:build]
|
60
14
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "fluent-plugin-s3"
|
6
|
+
gem.description = "Amazon S3 output plugin for Fluent event collector"
|
7
|
+
gem.homepage = "https://github.com/fluent/fluent-plugin-s3"
|
8
|
+
gem.summary = gem.description
|
9
|
+
gem.version = File.read("VERSION").strip
|
10
|
+
gem.authors = ["Sadayuki Furuhashi"]
|
11
|
+
gem.email = "frsyuki@gmail.com"
|
12
|
+
gem.has_rdoc = false
|
13
|
+
#gem.platform = Gem::Platform::RUBY
|
14
|
+
gem.files = `git ls-files`.split("\n")
|
15
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
gem.require_paths = ['lib']
|
18
|
+
|
19
|
+
gem.add_dependency "fluentd", "~> 0.10.0"
|
20
|
+
gem.add_dependency "aws-sdk", "~> 1.1.3"
|
21
|
+
end
|
data/lib/fluent/plugin/out_s3.rb
CHANGED
@@ -9,50 +9,20 @@ class S3Output < Fluent::TimeSlicedOutput
|
|
9
9
|
require 'aws-sdk'
|
10
10
|
require 'zlib'
|
11
11
|
require 'time'
|
12
|
+
require 'tempfile'
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
+
config_param :path, :string, :default => ""
|
16
|
+
config_param :time_format, :string, :default => nil
|
17
|
+
|
18
|
+
config_param :aws_key_id, :string
|
19
|
+
config_param :aws_sec_key, :string
|
20
|
+
config_param :s3_bucket, :string
|
15
21
|
|
16
22
|
def configure(conf)
|
17
23
|
super
|
18
24
|
|
19
|
-
|
20
|
-
@aws_key_id = aws_key_id
|
21
|
-
end
|
22
|
-
unless @aws_key_id
|
23
|
-
raise ConfigError, "'aws_key_id' parameter is required on s3 output"
|
24
|
-
end
|
25
|
-
|
26
|
-
if aws_sec_key = conf['aws_sec_key']
|
27
|
-
@aws_sec_key = aws_sec_key
|
28
|
-
end
|
29
|
-
unless @aws_sec_key
|
30
|
-
raise ConfigError, "'aws_sec_key' parameter is required on s3 output"
|
31
|
-
end
|
32
|
-
|
33
|
-
if s3_bucket = conf['s3_bucket']
|
34
|
-
@s3_bucket = s3_bucket
|
35
|
-
end
|
36
|
-
unless @s3_bucket
|
37
|
-
raise ConfigError, "'s3_bucket' parameter is required on s3 output"
|
38
|
-
end
|
39
|
-
|
40
|
-
if path = conf['path']
|
41
|
-
@path = path
|
42
|
-
end
|
43
|
-
unless @path
|
44
|
-
@path = ''
|
45
|
-
end
|
46
|
-
|
47
|
-
if @localtime
|
48
|
-
@formatter = Proc.new {|tag,time,record|
|
49
|
-
"#{Time.at(time).iso8601}\t#{tag}\t#{record.to_json}\n"
|
50
|
-
}
|
51
|
-
else
|
52
|
-
@formatter = Proc.new {|tag,time,record|
|
53
|
-
"#{Time.at(time).utc.iso8601}\t#{tag}\t#{record.to_json}\n"
|
54
|
-
}
|
55
|
-
end
|
25
|
+
@timef = TimeFormatter.new(@time_format, @localtime)
|
56
26
|
end
|
57
27
|
|
58
28
|
def start
|
@@ -64,17 +34,22 @@ class S3Output < Fluent::TimeSlicedOutput
|
|
64
34
|
end
|
65
35
|
|
66
36
|
def format(tag, time, record)
|
67
|
-
@
|
37
|
+
time_str = @timef.format(time)
|
38
|
+
"#{time_str}\t#{tag}\t#{record.to_json}\n"
|
68
39
|
end
|
69
40
|
|
70
41
|
def write(chunk)
|
71
|
-
|
42
|
+
i = 0
|
43
|
+
begin
|
44
|
+
s3path = "#{@path}#{chunk.key}_#{i}.gz"
|
45
|
+
i += 1
|
46
|
+
end while @bucket.objects[s3path].exists?
|
72
47
|
|
73
48
|
tmp = Tempfile.new("s3-")
|
74
49
|
w = Zlib::GzipWriter.new(tmp)
|
75
50
|
begin
|
76
51
|
chunk.write_to(w)
|
77
|
-
w.
|
52
|
+
w.close
|
78
53
|
@bucket.objects[s3path].write(Pathname.new(tmp.path))
|
79
54
|
ensure
|
80
55
|
w.close rescue nil
|
metadata
CHANGED
@@ -1,105 +1,82 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-s3
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Sadayuki Furuhashi
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-11-20 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: fluentd
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70187303391020 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
18
|
+
requirements:
|
27
19
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 55
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 10
|
33
|
-
- 0
|
20
|
+
- !ruby/object:Gem::Version
|
34
21
|
version: 0.10.0
|
35
22
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: aws-sdk
|
39
23
|
prerelease: false
|
40
|
-
|
24
|
+
version_requirements: *70187303391020
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: aws-sdk
|
27
|
+
requirement: &70187303539040 !ruby/object:Gem::Requirement
|
41
28
|
none: false
|
42
|
-
requirements:
|
29
|
+
requirements:
|
43
30
|
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
hash: 21
|
46
|
-
segments:
|
47
|
-
- 1
|
48
|
-
- 1
|
49
|
-
- 3
|
31
|
+
- !ruby/object:Gem::Version
|
50
32
|
version: 1.1.3
|
51
33
|
type: :runtime
|
52
|
-
|
53
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70187303539040
|
36
|
+
description: Amazon S3 output plugin for Fluent event collector
|
54
37
|
email: frsyuki@gmail.com
|
55
38
|
executables: []
|
56
|
-
|
57
39
|
extensions: []
|
58
|
-
|
59
|
-
|
40
|
+
extra_rdoc_files: []
|
41
|
+
files:
|
42
|
+
- AUTHORS
|
60
43
|
- ChangeLog
|
44
|
+
- Gemfile
|
61
45
|
- README.rdoc
|
62
|
-
files:
|
63
|
-
- AUTHORS
|
64
46
|
- Rakefile
|
65
47
|
- VERSION
|
48
|
+
- fluent-plugin-s3.gemspec
|
66
49
|
- lib/fluent/plugin/out_s3.rb
|
67
50
|
- test/out_s3.rb
|
68
|
-
-
|
69
|
-
- README.rdoc
|
70
|
-
has_rdoc: true
|
71
|
-
homepage: http://fluent.github.com/
|
51
|
+
homepage: https://github.com/fluent/fluent-plugin-s3
|
72
52
|
licenses: []
|
73
|
-
|
74
53
|
post_install_message:
|
75
|
-
rdoc_options:
|
76
|
-
|
77
|
-
require_paths:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
78
56
|
- lib
|
79
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
58
|
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
segments:
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
segments:
|
86
64
|
- 0
|
87
|
-
|
88
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
hash: -2936927257322544690
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
67
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
94
|
-
segments:
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
segments:
|
95
73
|
- 0
|
96
|
-
|
74
|
+
hash: -2936927257322544690
|
97
75
|
requirements: []
|
98
|
-
|
99
76
|
rubyforge_project:
|
100
|
-
rubygems_version: 1.
|
77
|
+
rubygems_version: 1.8.10
|
101
78
|
signing_key:
|
102
79
|
specification_version: 3
|
103
80
|
summary: Amazon S3 output plugin for Fluent event collector
|
104
|
-
test_files:
|
81
|
+
test_files:
|
105
82
|
- test/out_s3.rb
|