fluent-plugin-cat-sweep 0.0.1 → 0.1.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: 2c359caaffa952bd5d22a4e7a446bd817b9431c9
4
- data.tar.gz: b21ad62093a0737d4d67fe2a4e760d85a6593c68
3
+ metadata.gz: 9d379d06372f06e8fc8930c01c1cb35126344f56
4
+ data.tar.gz: 12bc664edebb79f7d0db631234b2cd2077b86bcc
5
5
  SHA512:
6
- metadata.gz: 8bdd6442226a93d646122f4b2c42399b3fd2388e40b20f483830275b858256619123acdf6853b3e34d90ade69dcfe8714d2da16243b9e83a98d28f46bbc7bc23
7
- data.tar.gz: d76f94192d97fcdfa559b0e66fec2efc6f3e68f97f79c5c89cf51190bd895807891430ccfe2207aa366e0cda5c1b95d60fd9074fb40859a23bbcd728d9c88d43
6
+ metadata.gz: 9c09d4acc0ecc381aa599b15995275b637f5c55def2df29ec2ede02e5c296d45923527bb39b7449875ed9515f94991136ffff520f44936411e9d05a7630a6b9c
7
+ data.tar.gz: 317727c30f4d959895db9e60ce2f995456000df1524c4907bfb4c50354aba22e904c51761c062d9be03727bda1cb3d4c934f7a957f56cb826a728388f46fe4a1
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # fluent-plugin-cat-sweep
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/civitaspo/fluent-plugin-cat-sweep.png?branch=master)](http://travis-ci.org/civitaspo/fluent-plugin-cat-sweep)
3
+ [![Circle CI](https://circleci.com/gh/civitaspo/fluent-plugin-cat-sweep.svg?style=svg)](https://circleci.com/gh/civitaspo/fluent-plugin-cat-sweep) [![Build Status](https://secure.travis-ci.org/civitaspo/fluent-plugin-cat-sweep.png?branch=master)](http://travis-ci.org/civitaspo/fluent-plugin-cat-sweep)
4
4
 
5
5
  Fluentd plugin to read data from files and to remove or move after processing.
6
6
 
@@ -20,6 +20,23 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install fluent-plugin-cat-sweep
22
22
 
23
+ ## Basic Behavior
24
+
25
+ Assume that an application outputs logs into `/tmp/test` directory as
26
+
27
+ ```
28
+ tmp/test
29
+ ├── accesss.log.201509151611
30
+ ├── accesss.log.201509151612
31
+ └── accesss.log.201509151613
32
+ ```
33
+
34
+ in every one minute interval.
35
+
36
+ This plugin watches the directory (`file_path_with_glob tmp/test/access.log.*`), and reads the contents and sweep (deafault: remove) for files whose mtime are passed in 60 seconds (can be configured with `waiting_seconds`).
37
+
38
+ Our assumption is that this mechanism should provide more durability than `in_tail` (batch read overcomes than streaming read).
39
+
23
40
  ## Configuration
24
41
 
25
42
  ```
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-cat-sweep"
7
- spec.version = "0.0.1"
7
+ spec.version = "0.1.0"
8
8
  spec.authors = ["Civitaspo(takahiro.nakayama)"]
9
9
  spec.email = ["civitaspo@gmail.com"]
10
10
 
@@ -50,8 +50,20 @@ module Fluent
50
50
  raise Fluent::ConfigError, "in_cat_sweep: `line_terminated_by` must has some letters."
51
51
  end
52
52
 
53
- if !remove_file? and !Dir.exists?(@move_to)
54
- raise Fluent::ConfigError, "in_cat_sweep: `move_to` directory must be existed."
53
+ if !remove_file?
54
+ first_filename = Dir.glob(@file_path_with_glob).first
55
+ dirname = first_filename ? move_dirname(first_filename) : @move_to
56
+ if Dir.exist?(dirname)
57
+ if !File.writable?(dirname)
58
+ raise Fluent::ConfigError, "in_cat_sweep: `move_to` directory (#{dirname}) must be writable."
59
+ end
60
+ else
61
+ begin
62
+ FileUtils.mkdir_p(dirname)
63
+ rescue => e
64
+ raise Fluent::ConfigError, "in_cat_sweep: `move_to` directory (#{dirname}) must be writable."
65
+ end
66
+ end
55
67
  end
56
68
 
57
69
  @read_bytes_once = 262144 # 256 KB
@@ -82,10 +94,9 @@ module Fluent
82
94
  after_processing(processing_filename)
83
95
  end
84
96
  rescue => e
85
- log.error "in_cat_sweep: processing error: #{e}, file: #{processing_filename}",
86
- :error => e, :error_class => e.class
97
+ log.error "in_cat_sweep: processing: #{processing_filename}", :error => e, :error_class => e.class
87
98
  log.error_backtrace
88
- safe_fail(processing_filename)
99
+ safe_fail(e, processing_filename)
89
100
  end
90
101
  end
91
102
  end
@@ -112,19 +123,26 @@ module Fluent
112
123
  def get_processing_filename(filename)
113
124
  tmpfile = String.new
114
125
  tmpfile << filename << '.' << Process.pid.to_s << '.'
115
- tmpfile << Time.now.to_i.to_s << '.' << @processing_file_suffix
126
+ tmpfile << Time.now.to_i.to_s << @processing_file_suffix
127
+ end
128
+
129
+ def revert_processing_filename(processing_filename)
130
+ tmpfile = processing_filename.dup
131
+ tmpfile.chomp!(@processing_file_suffix)
132
+ tmpfile.gsub!(/\.\d+\.\d+$/, '')
116
133
  end
117
134
 
118
- def get_error_filename(filename)
135
+ def get_error_filename(e, filename)
119
136
  errfile = String.new
120
- errfile << filename << '.' << @error_file_suffix
137
+ errfile << filename << "." << e.class.to_s << @error_file_suffix
121
138
  end
122
139
 
123
- def safe_fail(filename)
140
+ def safe_fail(e, filename)
124
141
  begin
125
- lock_with_renaming(filename, get_error_filename(filename))
142
+ error_filename = get_error_filename(e, filename)
143
+ lock_with_renaming(filename, error_filename)
126
144
  rescue => e
127
- log.error "in_cat_sweep: rename #{filename} to error name. message: #{e}",
145
+ log.error "in_cat_sweep: rename #{filename} to error filename #{error_filename}",
128
146
  :error => e, :error_class => e.class
129
147
  log.error_backtrace
130
148
  end
@@ -201,11 +219,18 @@ module Fluent
201
219
  end
202
220
  end
203
221
 
204
- def after_processing(filename)
222
+ def move_dirname(filename)
223
+ File.join(@move_to, File.dirname(File.expand_path(filename)))
224
+ end
225
+
226
+ def after_processing(processing_filename)
205
227
  if remove_file?
206
- FileUtils.rm(filename)
228
+ FileUtils.rm(processing_filename)
207
229
  else
208
- FileUtils.mv(filename, @move_to)
230
+ dirname = move_dirname(processing_filename)
231
+ FileUtils.mkdir_p(dirname)
232
+ filename = revert_processing_filename(File.basename(processing_filename))
233
+ FileUtils.mv(processing_filename, File.join(dirname, filename))
209
234
  end
210
235
  end
211
236
  end
@@ -117,11 +117,11 @@ class CatSweepInputTest < Test::Unit::TestCase
117
117
 
118
118
  assert(Dir.glob("#{TMP_DIR_FROM}/test_move_file*").empty?)
119
119
  assert_match(
120
- %r{\A#{TMP_DIR_TO}/test_move_file.*\.processing},
121
- Dir.glob("#{TMP_DIR_TO}/test_move_file*").first)
120
+ %r{\A#{TMP_DIR_TO}#{TMP_DIR_FROM}/test_move_file},
121
+ Dir.glob("#{TMP_DIR_TO}#{TMP_DIR_FROM}/test_move_file*").first)
122
122
  assert_equal(
123
123
  test_cases.map{|t|t['msg']}.join.to_s,
124
- File.read(Dir.glob("#{TMP_DIR_TO}/test_move_file*").first))
124
+ File.read(Dir.glob("#{TMP_DIR_TO}#{TMP_DIR_FROM}/test_move_file*").first))
125
125
  end
126
126
 
127
127
  def test_oneline_max_bytes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-cat-sweep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Civitaspo(takahiro.nakayama)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-16 00:00:00.000000000 Z
11
+ date: 2015-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd