tailf2kafka 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +32 -1
- data/bin/tailf2kafka +4 -4
- data/lib/tailf2kafka/version.rb +1 -1
- data/tailf2kafka.gemspec +1 -0
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4c3bad1a4caca5027bba89946e2a38de39bb6b7
|
4
|
+
data.tar.gz: 07b8a91f46d3592384200bc07418cfc0c514615f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62bba4611e56095855356bfd0e76c2173004f1948dcab31495701b94c29849b60df7a88a940b60334172f09f03b79606a8ee40a1b89518c9dc82e723c7334dae
|
7
|
+
data.tar.gz: 34232db94d928667aded3b4cd6ac544f8a487993087938b74f626806bd0a6e14f9bf3ff2c982242fc2f55955181e50530d16eb387a07924a454812aff6e20640
|
data/README.md
CHANGED
@@ -5,13 +5,17 @@ Watch and tail files in dirs with specified filename time based patterns and pus
|
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
|
8
|
+
Install libsnappy dev libs if you want to take advantage of compression
|
9
|
+
|
10
|
+
apt-get install libsnappy-dev
|
11
|
+
|
8
12
|
Add this line to your application's Gemfile:
|
9
13
|
|
10
14
|
gem 'tailf2kafka'
|
11
15
|
|
12
16
|
And then execute:
|
13
17
|
|
14
|
-
$ bundle
|
18
|
+
$ bundle install
|
15
19
|
|
16
20
|
Or install it yourself as:
|
17
21
|
|
@@ -31,6 +35,7 @@ Or install it yourself as:
|
|
31
35
|
files:
|
32
36
|
- topic: haproxy
|
33
37
|
prefix: /var/log/haproxy/haproxy
|
38
|
+
suffix: ''
|
34
39
|
time_pattern: ".%Y-%m-%d.%H"
|
35
40
|
position_file: "/var/lib/haproxy/tail2kafka.offsets"
|
36
41
|
flush_interval: 1
|
@@ -40,6 +45,32 @@ Or install it yourself as:
|
|
40
45
|
kafka:
|
41
46
|
brokers: ["broker1:9092", "broker2:9092", "broker3:9092"]
|
42
47
|
producer_type: sync
|
48
|
+
produce: true
|
49
|
+
|
50
|
+
* kafka.brokers - Array of kafka brokers to connect to
|
51
|
+
* kafka.producer_type - type of producer sync or async
|
52
|
+
* kafka.produce - if false will not conect to kafka and will not produce any messages to it
|
53
|
+
* tailf.position_file - file where to save tailed files offsets which were pushed to kafka
|
54
|
+
* tailf.flush_interval - how often in seconds to save the offsets to a file
|
55
|
+
* tailf.max_batch_lines - max number of lines to batch in each send request
|
56
|
+
* tailf.from_beggining - in case of a new file added to tailing , if to start tailing from beggining or end of the file
|
57
|
+
* tailf.delete_old_tailed_files - if to delete files once their time_pattern does not match the current time window and if they have been fully produced to kafka
|
58
|
+
* tailf.files - array of file configs for tail, each tailed file configs consists of:
|
59
|
+
* topic - which kafka topic to produce the messages to
|
60
|
+
* prefix - the files prefix to watch for
|
61
|
+
* time_pattern - ruby time pattern of files to tail
|
62
|
+
* suffix - optional suffix of files to watch for
|
63
|
+
so the tool will watch for files that match - prefix + time_pattern + suffix
|
64
|
+
|
65
|
+
## Features/Facts
|
66
|
+
|
67
|
+
* The config is validated by [schash](https://github.com/ryotarai/schash) gem
|
68
|
+
* Tailed files are watched for changes by [rb-notify](https://github.com/nex3/rb-inotify) gem
|
69
|
+
* Dirnames of all files prefixes are watched for new files creation or files moved to the dir and are automaticaly
|
70
|
+
added to tailing.
|
71
|
+
* As well dirnames are watched for deletion or files being moved out of directory, and they are removed from the list of files watched for changing.
|
72
|
+
* Based time_pattern, files are periodicaly autodeleted , thus avoiding need for log rotation tools.
|
73
|
+
* Files are matched by converting time_pattern to a regexp
|
43
74
|
|
44
75
|
## Contributing
|
45
76
|
|
data/bin/tailf2kafka
CHANGED
@@ -168,7 +168,7 @@ end
|
|
168
168
|
dir = File.dirname(tailf_file[:prefix])
|
169
169
|
if File.exists?(dir) and File.directory?(dir)
|
170
170
|
@dirs[dir] ||= []
|
171
|
-
@dirs[dir] << { :prefix => File.basename(tailf_file[:prefix]), :pattern => tailf_file[:time_pattern], :suffix => "#{tailf_file[:suffix]}" }
|
171
|
+
@dirs[dir] << { :prefix => File.basename(tailf_file[:prefix]), :pattern => tailf_file[:time_pattern], :suffix => "#{tailf_file[:suffix]}", :topic => tailf_file[:topic]}
|
172
172
|
Dir.glob("#{tailf_file[:prefix]}*#{tailf_file[:suffix]}").each do |path|
|
173
173
|
if path.match(Regexp.new(time_pattern_to_regexp(tailf_file[:time_pattern])))
|
174
174
|
unless File.directory?(path)
|
@@ -207,12 +207,12 @@ Thread.new { loop { @timers.wait } }
|
|
207
207
|
@create_notifier.watch(dir, :create, :moved_to) do |event|
|
208
208
|
@mutex.synchronize do
|
209
209
|
path = "#{dir}/#{event.name}"
|
210
|
-
|
211
|
-
|
210
|
+
match = @dirs[dir].detect{|h| event.name.match(Regexp.new(h[:prefix] + time_pattern_to_regexp(h[:pattern]) + h[:suffix]))}
|
211
|
+
if match
|
212
212
|
unless File.directory?(path)
|
213
213
|
unless @threads.has_key?(path)
|
214
214
|
puts "File #{event.name} was created in / moved into watched dir #{dir}"
|
215
|
-
@files[path] = { :pattern => match
|
215
|
+
@files[path] = { :pattern => match[:pattern], :topic => match[:topic], :inode => File.stat(path).ino, :offset => 0 }
|
216
216
|
@threads[path] = Thread.new { tailf(path) }
|
217
217
|
end
|
218
218
|
end
|
data/lib/tailf2kafka/version.rb
CHANGED
data/tailf2kafka.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tailf2kafka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Piavlo
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: snappy
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: hash_symbolizer
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|