fluent-plugin-file-alternative 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 717fa824f86b1d9e7efd9a2c72bc90745886bd85
4
- data.tar.gz: 53299516fbc595bc4083fa1859f76764759ab003
3
+ metadata.gz: ea52057a062ad50131a6e1cf865c06c7bb8b69d2
4
+ data.tar.gz: efd08dcdc758d6f6ffab1b1767ecf613ea9a7cc9
5
5
  SHA512:
6
- metadata.gz: 5bb40a237167cb760d77ef7c9d50b8ee390f12a541d633f79d656e7c64efb88ec4f12e1ef3d5513dcf32fc0b62a45fd69d1642e8e178cb61eb35812351050295
7
- data.tar.gz: fd7c06f49331ce0b890bc2e38a2b6db7ad387cc2ce7bfe3746f39b82c78526277938a02259384b6eb77bf4dc04520567b316bb032640ff2cabf95b5c677eec2f
6
+ metadata.gz: c78ef8f78cb7cbaf29ae78287beaba67d6267624599b3116bf9aa69050a158175e5fba4ec50c125ed9adb1a959f398dd20e55aa0e32d6b231b651023e9bb6f30
7
+ data.tar.gz: 3d618956f885a15c80984cec1da9425783e8332fa3912bc0218e56e3b6c5d8a30a705865e271cc9c02055b1279d1affe0819d2dd0e116616bbd9f2590ed67f3f
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # fluent-plugin-file-alternative
2
2
 
3
- File output plugin alternative implementation, **is 100% compatible with
4
- [Fluentd](http://fluentd.org) built-in 'out_file'**, and added many options to format output as you want.
3
+ File output plugin alternative implementation.
5
4
 
6
5
  FileAlternativeOutput slices data by time (for specified units), and store these data as plain text on local file. You can specify to:
7
6
 
@@ -14,19 +13,19 @@ FileAlternativeOutput slices data by time (for specified units), and store these
14
13
  And you can specify output file path as:
15
14
 
16
15
  * Standard out_file way
17
- * configure 'path /path/to/dir/access'
18
- * and 'time\_slice\_format %Y%m%d'
19
- * got '/path/to/dir/access.20120316.log'
16
+ * configure `path /path/to/dir/access`
17
+ * and `time_slice_format %Y%m%d`
18
+ * got `/path/to/dir/access.20120316.log`
19
+ * Standard out_file way (alternative)
20
+ * configure `path /path/to/dir/access.*.log`
21
+ * and `time_slice_format %Y%m%d`
22
+ * got `/path/to/dir/access.20120316.log`
20
23
  * Alternative style
21
- * configure 'path /path/to/dir/access.%Y%m%d.log' only
22
- * got '/path/to/dir/access.20120316.log'
24
+ * configure `path /path/to/dir/access.%Y%m%d.log` only (don't include `*`)
25
+ * got `/path/to/dir/access.20120316.log`
23
26
 
24
27
  And, gzip compression is also supported.
25
28
 
26
- -### Why this is not a patch for out_file?
27
- -
28
- -`fluent-plugin-file-alternative` has optimized buffer data structure to make faster to write data on disk. But that buffer structure is not compatible with `out_file`'s one. That's tha reason why this plugin is an another plugin from `out_file`.
29
-
30
29
  ## Configuration
31
30
 
32
31
  ### FileAlternativeOutput
@@ -36,7 +35,7 @@ Standard out_file way (hourly log, compression, time-tag-json):
36
35
  <match out.**>
37
36
  type file_alternative
38
37
  path /var/log/service/access.*.log
39
- time_slice_output %Y%m%d_%H
38
+ time_slice_format %Y%m%d_%H
40
39
  compress gzip
41
40
  </match>
42
41
 
@@ -57,6 +56,8 @@ If you don't want fluentd-time and tag in written file, and messages with single
57
56
  output_include_tag false
58
57
  output_data_type attr:message
59
58
  add_newline false
59
+ symlink_path /var/log/service/access_latest.log
60
+ dir_mode 0777
60
61
  </match>
61
62
 
62
63
  Then, you will get:
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = "fluent-plugin-file-alternative"
5
- gem.version = "0.1.5"
5
+ gem.version = "0.2.0"
6
6
 
7
7
  gem.authors = ["TAGOMORI Satoshi"]
8
8
  gem.email = ["tagomoris@gmail.com"]
@@ -19,4 +19,5 @@ Gem::Specification.new do |gem|
19
19
  gem.add_runtime_dependency "fluentd", ">= 0.10.39" # This version for @buffer.symlink_path
20
20
  gem.add_runtime_dependency "fluent-mixin-plaintextformatter"
21
21
  gem.add_development_dependency "rake"
22
+ gem.add_development_dependency "test-unit"
22
23
  end
@@ -27,6 +27,8 @@ class Fluent::FileAlternativeOutput < Fluent::TimeSlicedOutput
27
27
 
28
28
  config_param :symlink_path, :string, :default => nil
29
29
 
30
+ config_param :dir_mode, :string, :default => '0777'
31
+
30
32
  include Fluent::Mixin::PlainTextFormatter
31
33
 
32
34
  def initialize
@@ -133,7 +135,12 @@ class Fluent::FileAlternativeOutput < Fluent::TimeSlicedOutput
133
135
  path = path_format(chunk.key)
134
136
 
135
137
  begin
136
- FileUtils.mkdir_p File.dirname(path)
138
+ require 'pathname'
139
+
140
+ Pathname.new(path).descend {|p|
141
+ FileUtils.mkdir_p( File.dirname(p)) unless File.directory?(p)
142
+ FileUtils.chmod @dir_mode.to_i(8), File.dirname(p) unless File.directory?(p)
143
+ }
137
144
 
138
145
  case @compress
139
146
  when :gz
@@ -31,6 +31,7 @@ class FileAlternativeOutputTest < Test::Unit::TestCase
31
31
 
32
32
  d = create_driver %[
33
33
  path #{TMP_DIR}/accesslog.%Y-%m-%d-%H-%M-%S
34
+ dir_mode 0700
34
35
  ]
35
36
  assert_equal '%Y%m%d%H%M%S', d.instance.time_slice_format
36
37
  assert_nil d.instance.compress
@@ -39,6 +40,7 @@ class FileAlternativeOutputTest < Test::Unit::TestCase
39
40
  assert_equal 'json', d.instance.output_data_type
40
41
  assert_equal true, d.instance.add_newline
41
42
  assert_equal "TAB", d.instance.field_separator
43
+ assert_equal '0700', d.instance.dir_mode
42
44
  assert_nil d.instance.remove_prefix
43
45
  end
44
46
 
@@ -109,7 +111,7 @@ class FileAlternativeOutputTest < Test::Unit::TestCase
109
111
  d2.expect_format %[123-456-789\n]
110
112
  path = d2.run
111
113
  assert_equal "#{TMP_DIR}/accesslog.2011-01-02-13-14-15", path[0]
112
-
114
+
113
115
  d3 = create_driver %[
114
116
  path #{TMP_DIR}/accesslog.%Y-%m-%d-%H-%M-%S
115
117
  compress gzip
@@ -129,6 +131,20 @@ class FileAlternativeOutputTest < Test::Unit::TestCase
129
131
  d3.expect_format %[app01,info,Send response\n]
130
132
  path = d3.run
131
133
  assert_equal "#{TMP_DIR}/accesslog.2011-01-02-13-14-15.gz", path[0]
134
+
135
+ d4 = create_driver %[
136
+ path #{TMP_DIR}/path_to_test/%Y/%m/%d/accesslog.%Y-%m-%d-%H-%M-%S
137
+ dir_mode 0700
138
+ ]
139
+
140
+ time = Time.parse("2011-01-02 13:14:15 UTC").to_i
141
+ d4.emit({"server" => "www01", "level" => "warn", "log" => "Exception\n"}, time)
142
+ path = d4.run
143
+ assert_equal '40700', File.stat(File.dirname(File.dirname(File.dirname(path[0])))).mode.to_s(8)
144
+ assert_equal '40700', File.stat(File.dirname(File.dirname(path[0]))).mode.to_s(8)
145
+ assert_equal '40700', File.stat(File.dirname(path[0])).mode.to_s(8)
146
+ assert_equal "#{TMP_DIR}/path_to_test/2011/01/02/accesslog.2011-01-02-13-14-15", path[0]
147
+
132
148
  end
133
149
 
134
150
  def test_write_with_symlink
@@ -143,16 +159,17 @@ class FileAlternativeOutputTest < Test::Unit::TestCase
143
159
  d.run
144
160
  assert File.exists?(symlink_path)
145
161
  assert File.symlink?(symlink_path)
146
-
162
+
147
163
  d.instance.start
148
164
  begin
149
165
  10.times { sleep 0.05 }
150
166
  d.instance.enqueue_buffer
151
-
167
+
152
168
  assert !File.exists?(symlink_path)
153
169
  assert File.symlink?(symlink_path)
154
170
  ensure
155
171
  d.instance.shutdown
156
172
  end
157
173
  end
174
+
158
175
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-file-alternative
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-07 00:00:00.000000000 Z
11
+ date: 2015-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: alternative implementation of out_file, with various configurations
56
70
  email:
57
71
  - tagomoris@gmail.com
@@ -69,7 +83,6 @@ files:
69
83
  - lib/fluent/plugin/out_file_alternative.rb
70
84
  - test/helper.rb
71
85
  - test/plugin/test_out_file_alternative.rb
72
- - test/plugin/test_out_file_original.rb
73
86
  homepage: https://github.com/tagomoris/fluent-plugin-file-alternative
74
87
  licenses:
75
88
  - APLv2
@@ -90,11 +103,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
103
  version: '0'
91
104
  requirements: []
92
105
  rubyforge_project:
93
- rubygems_version: 2.2.2
106
+ rubygems_version: 2.4.5
94
107
  signing_key:
95
108
  specification_version: 4
96
109
  summary: alternative implementation of out_file
97
110
  test_files:
98
111
  - test/helper.rb
99
112
  - test/plugin/test_out_file_alternative.rb
100
- - test/plugin/test_out_file_original.rb
113
+ has_rdoc:
@@ -1,81 +0,0 @@
1
- require 'fluent/test'
2
- require 'fileutils'
3
- require 'time'
4
-
5
- class FileOutputTest < Test::Unit::TestCase
6
- def setup
7
- Fluent::Test.setup
8
- FileUtils.rm_rf(TMP_DIR)
9
- FileUtils.mkdir_p(TMP_DIR)
10
- end
11
-
12
- TMP_DIR = File.dirname(__FILE__) + "/../tmp"
13
-
14
- CONFIG = %[
15
- path #{TMP_DIR}/out_file_test
16
- compress gz
17
- utc
18
- ]
19
-
20
- def create_driver(conf = CONFIG)
21
- Fluent::Test::BufferedOutputTestDriver.new(Fluent::FileOutput).configure(conf)
22
- end
23
-
24
- def test_configure
25
- d = create_driver %[
26
- path test_path
27
- compress gz
28
- ]
29
- assert_equal 'test_path', d.instance.path
30
- assert_equal :gz, d.instance.compress
31
- end
32
-
33
- def test_format
34
- d = create_driver
35
-
36
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
37
- d.emit({"a"=>1}, time)
38
- d.emit({"a"=>2}, time)
39
-
40
- d.expect_format %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n]
41
- d.expect_format %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n]
42
-
43
- d.run
44
- end
45
-
46
- def test_write
47
- d = create_driver
48
-
49
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
50
- d.emit({"a"=>1}, time)
51
- d.emit({"a"=>2}, time)
52
-
53
- # FileOutput#write returns path
54
- path = d.run
55
- expect_path = "#{TMP_DIR}/out_file_test._0.log.gz"
56
- assert_equal expect_path, path
57
-
58
- data = Zlib::GzipReader.open(expect_path) {|f| f.read }
59
- assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n] +
60
- %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n],
61
- data
62
- end
63
-
64
- def test_write_path_increment
65
- d = create_driver
66
-
67
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
68
- d.emit({"a"=>1}, time)
69
- d.emit({"a"=>2}, time)
70
-
71
- # FileOutput#write returns path
72
- path = d.run
73
- assert_equal "#{TMP_DIR}/out_file_test._0.log.gz", path
74
-
75
- path = d.run
76
- assert_equal "#{TMP_DIR}/out_file_test._1.log.gz", path
77
-
78
- path = d.run
79
- assert_equal "#{TMP_DIR}/out_file_test._2.log.gz", path
80
- end
81
- end