logstash-input-file_progress 2.0.0 → 3.0.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/logstash/inputs/file_progress.rb +281 -79
- data/logstash-input-file_progress.gemspec +8 -5
- metadata +68 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a98b141a82a617952182b9043cba8dc852c32b0
|
4
|
+
data.tar.gz: fda790b78cd799b3e3414f98fd3995e9a571937f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66a14a04273111a463ada9617f2729b3546e983fcf83f7ed3f520dcfc0ab1ef42afea12dac5271370e7d585f5ecf2d240fe38dbf81ee3c82cfe10371267cce84
|
7
|
+
data.tar.gz: 6d6a255e26ff38daca119bab8f094b57d8d8bb57d2bd6df75034653b4ccabac486701ef10a42fbeb4d18a9f6ea05ac340fa3609610509a6c17d7c9855c4f4845
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
## 2.1.0
|
2
|
+
- Changed dependency to new logstash-core-plugin-api
|
3
|
+
|
1
4
|
## 2.0.0
|
2
5
|
- Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
|
3
6
|
instead of using Thread.raise on the plugins' threads. Ref: https://github.com/elastic/logstash/pull/3895
|
@@ -1,97 +1,198 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
require "logstash/inputs/base"
|
4
2
|
require "logstash/namespace"
|
3
|
+
require "logstash/inputs/base"
|
4
|
+
require "logstash/codecs/identity_map_codec"
|
5
|
+
require "logstash/codecs/plain"
|
5
6
|
|
6
7
|
require "pathname"
|
7
8
|
require "socket" # for Socket.gethostname
|
8
9
|
|
9
|
-
# Stream events from files
|
10
|
+
# Stream events from files, normally by tailing them in a manner
|
11
|
+
# similar to `tail -0F` but optionally reading them from the
|
12
|
+
# beginning.
|
13
|
+
#
|
14
|
+
# By default, each event is assumed to be one line. If you would like
|
15
|
+
# to join multiple log lines into one event, you'll want to use the
|
16
|
+
# multiline codec or filter.
|
17
|
+
#
|
18
|
+
# The plugin aims to track changing files and emit new content as it's
|
19
|
+
# appended to each file. It's not well-suited for reading a file from
|
20
|
+
# beginning to end and storing all of it in a single event (not even
|
21
|
+
# with the multiline codec or filter).
|
22
|
+
#
|
23
|
+
# ==== Tracking of current position in watched files
|
24
|
+
#
|
25
|
+
# The plugin keeps track of the current position in each file by
|
26
|
+
# recording it in a separate file named sincedb. This makes it
|
27
|
+
# possible to stop and restart Logstash and have it pick up where it
|
28
|
+
# left off without missing the lines that were added to the file while
|
29
|
+
# Logstash was stopped.
|
30
|
+
#
|
31
|
+
# By default, the sincedb file is placed in the home directory of the
|
32
|
+
# user running Logstash with a filename based on the filename patterns
|
33
|
+
# being watched (i.e. the `path` option). Thus, changing the filename
|
34
|
+
# patterns will result in a new sincedb file being used and any
|
35
|
+
# existing current position state will be lost. If you change your
|
36
|
+
# patterns with any frequency it might make sense to explicitly choose
|
37
|
+
# a sincedb path with the `sincedb_path` option.
|
10
38
|
#
|
11
|
-
#
|
12
|
-
#
|
39
|
+
# A different `sincedb_path` must be used for each input. Using the same
|
40
|
+
# path will cause issues. The read checkpoints for each input must be
|
41
|
+
# stored in a different path so the information does not override.
|
13
42
|
#
|
14
|
-
#
|
15
|
-
# is detected and handled by this input.
|
43
|
+
# Sincedb files are text files with four columns:
|
16
44
|
#
|
17
|
-
#
|
18
|
-
#
|
45
|
+
# . The inode number (or equivalent).
|
46
|
+
# . The major device number of the file system (or equivalent).
|
47
|
+
# . The minor device number of the file system (or equivalent).
|
48
|
+
# . The current byte offset within the file.
|
49
|
+
#
|
50
|
+
# On non-Windows systems you can obtain the inode number of a file
|
51
|
+
# with e.g. `ls -li`.
|
52
|
+
#
|
53
|
+
# ==== File rotation
|
54
|
+
#
|
55
|
+
# File rotation is detected and handled by this input, regardless of
|
56
|
+
# whether the file is rotated via a rename or a copy operation. To
|
57
|
+
# support programs that write to the rotated file for some time after
|
58
|
+
# the rotation has taken place, include both the original filename and
|
59
|
+
# the rotated filename (e.g. /var/log/syslog and /var/log/syslog.1) in
|
60
|
+
# the filename patterns to watch (the `path` option). Note that the
|
61
|
+
# rotated filename will be treated as a new file so if
|
62
|
+
# `start_position` is set to 'beginning' the rotated file will be
|
63
|
+
# reprocessed.
|
64
|
+
#
|
65
|
+
# With the default value of `start_position` ('end') any messages
|
66
|
+
# written to the end of the file between the last read operation prior
|
67
|
+
# to the rotation and its reopening under the new name (an interval
|
68
|
+
# determined by the `stat_interval` and `discover_interval` options)
|
69
|
+
# will not get picked up.
|
70
|
+
|
71
|
+
class LogStash::Codecs::Base
|
72
|
+
# TODO - move this to core
|
73
|
+
if !method_defined?(:accept)
|
74
|
+
def accept(listener)
|
75
|
+
decode(listener.data) do |event|
|
76
|
+
listener.process_event(event)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
if !method_defined?(:auto_flush)
|
81
|
+
def auto_flush(*)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
19
86
|
class LogStash::Inputs::FileProgress < LogStash::Inputs::Base
|
20
87
|
config_name "file_progress"
|
21
88
|
|
22
|
-
#
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
# The path to the file to use as an input.
|
27
|
-
# You can use globs here, such as `/var/log/*.log`
|
89
|
+
# The path(s) to the file(s) to use as an input.
|
90
|
+
# You can use filename patterns here, such as `/var/log/*.log`.
|
91
|
+
# If you use a pattern like `/var/log/**/*.log`, a recursive search
|
92
|
+
# of `/var/log` will be done for all `*.log` files.
|
28
93
|
# Paths must be absolute and cannot be relative.
|
94
|
+
#
|
95
|
+
# You may also configure multiple paths. See an example
|
96
|
+
# on the <<array,Logstash configuration page>>.
|
29
97
|
config :path, :validate => :array, :required => true
|
30
98
|
|
31
|
-
# Exclusions (matched against the filename, not full path).
|
32
|
-
# are valid here, too. For example, if you have
|
33
|
-
#
|
99
|
+
# Exclusions (matched against the filename, not full path). Filename
|
100
|
+
# patterns are valid here, too. For example, if you have
|
101
|
+
# [source,ruby]
|
34
102
|
# path => "/var/log/*"
|
35
103
|
#
|
36
|
-
#
|
37
|
-
#
|
104
|
+
# You might want to exclude gzipped files:
|
105
|
+
# [source,ruby]
|
38
106
|
# exclude => "*.gz"
|
39
107
|
config :exclude, :validate => :array
|
40
108
|
|
41
|
-
# How often we stat files to see if they have been modified.
|
42
|
-
# this interval will decrease the number of system calls we make,
|
43
|
-
# increase the time to detect new log lines.
|
109
|
+
# How often (in seconds) we stat files to see if they have been modified.
|
110
|
+
# Increasing this interval will decrease the number of system calls we make,
|
111
|
+
# but increase the time to detect new log lines.
|
44
112
|
config :stat_interval, :validate => :number, :default => 1
|
45
113
|
|
46
|
-
# How often we expand
|
114
|
+
# How often (in seconds) we expand the filename patterns in the
|
115
|
+
# `path` option to discover new files to watch.
|
47
116
|
config :discover_interval, :validate => :number, :default => 15
|
48
117
|
|
49
|
-
#
|
50
|
-
# position of monitored log files)
|
51
|
-
# sincedb files to some path matching
|
52
|
-
|
118
|
+
# Path of the sincedb database file (keeps track of the current
|
119
|
+
# position of monitored log files) that will be written to disk.
|
120
|
+
# The default will write sincedb files to some path matching `$HOME/.sincedb*`
|
121
|
+
# NOTE: it must be a file path and not a directory path
|
122
|
+
config :sincedb_path, :validate => :string
|
53
123
|
|
54
|
-
# How often to write a since database with the current position of
|
124
|
+
# How often (in seconds) to write a since database with the current position of
|
55
125
|
# monitored log files.
|
56
126
|
config :sincedb_write_interval, :validate => :number, :default => 15
|
57
127
|
|
58
|
-
#
|
128
|
+
# TODO edit description
|
129
|
+
# Choose where Logstash starts initially reading files: at the beginning or
|
59
130
|
# at the end. The default behavior treats files like live streams and thus
|
60
131
|
# starts at the end. If you have old data you want to import, set this
|
61
|
-
# to 'beginning'
|
132
|
+
# to 'beginning'.
|
62
133
|
#
|
63
|
-
# This option only
|
64
|
-
# and not seen before.
|
65
|
-
#
|
134
|
+
# This option only modifies "first contact" situations where a file
|
135
|
+
# is new and not seen before, i.e. files that don't have a current
|
136
|
+
# position recorded in a sincedb file read by Logstash. If a file
|
137
|
+
# has already been seen before, this option has no effect and the
|
138
|
+
# position recorded in the sincedb file will be used.
|
66
139
|
config :start_position, :validate => [ "beginning", "end"], :default => "beginning"
|
67
140
|
|
68
|
-
#
|
69
|
-
config :
|
141
|
+
# set the new line delimiter, defaults to "\n"
|
142
|
+
config :delimiter, :validate => :string, :default => "\n"
|
143
|
+
|
144
|
+
# When the file input discovers a file that was last modified
|
145
|
+
# before the specified timespan in seconds, the file is ignored.
|
146
|
+
# After it's discovery, if an ignored file is modified it is no
|
147
|
+
# longer ignored and any new data is read. The default is 1 year.
|
148
|
+
config :ignore_older, :validate => :number, :default => 24 * 60 * 60 * 365
|
70
149
|
|
71
|
-
#
|
72
|
-
|
150
|
+
# The file input closes any files that were last read the specified
|
151
|
+
# timespan in seconds ago.
|
152
|
+
# This has different implications depending on if a file is being tailed or
|
153
|
+
# read. If tailing, and there is a large time gap in incoming data the file
|
154
|
+
# can be closed (allowing other files to be opened) but will be queued for
|
155
|
+
# reopening when new data is detected. If reading, the file will be closed
|
156
|
+
# after closed_older seconds from when the last bytes were read.
|
157
|
+
# The default is 1 hour
|
158
|
+
config :close_older, :validate => :number, :default => 1 * 60 * 60
|
73
159
|
|
74
|
-
#
|
160
|
+
# What is the maximum number of file_handles that this input consumes
|
161
|
+
# at any one time. Use close_older to close some files if you need to
|
162
|
+
# process more files than this number. This should not be set to the
|
163
|
+
# maximum the OS can do because file handles are needed for other
|
164
|
+
# LS plugins and OS processes.
|
165
|
+
# The default of 4095 is set in filewatch.
|
166
|
+
config :max_open_files, :validate => :number
|
167
|
+
|
168
|
+
# Close the file when end of file is reached
|
75
169
|
# This make sense when reading a file once from the beginning and want to e.g.
|
76
170
|
# proceed renaming or deleting the parent folder
|
77
|
-
config :eof_close, :validate => :boolean, :default =>
|
171
|
+
config :eof_close, :validate => :boolean, :default => true
|
172
|
+
|
173
|
+
# How often (in milliseconds) to add progress-info to metadata with the current position of
|
174
|
+
# monitored log files.
|
175
|
+
config :progress_write_interval, :validate => :number, :default => 200
|
78
176
|
|
79
177
|
public
|
80
178
|
def register
|
81
179
|
require "addressable/uri"
|
82
|
-
require "filewatch/ext/
|
180
|
+
require "filewatch/ext/tail"
|
83
181
|
require "digest/md5"
|
84
182
|
@logger.info("Registering file input", :path => @path)
|
183
|
+
@host = Socket.gethostname.force_encoding(Encoding::UTF_8)
|
85
184
|
|
86
185
|
@tail_config = {
|
87
186
|
:exclude => @exclude,
|
88
187
|
:stat_interval => @stat_interval,
|
89
188
|
:discover_interval => @discover_interval,
|
90
189
|
:sincedb_write_interval => @sincedb_write_interval,
|
91
|
-
:
|
92
|
-
:
|
93
|
-
:
|
94
|
-
:
|
190
|
+
:delimiter => @delimiter,
|
191
|
+
:ignore_older => @ignore_older,
|
192
|
+
:close_older => @close_older,
|
193
|
+
:max_open_files => @max_open_files,
|
194
|
+
:eof_close => true,
|
195
|
+
:progress_write_interval => @progress_write_interval
|
95
196
|
}
|
96
197
|
|
97
198
|
@path.each do |path|
|
@@ -100,52 +201,153 @@ class LogStash::Inputs::FileProgress < LogStash::Inputs::Base
|
|
100
201
|
end
|
101
202
|
end
|
102
203
|
|
204
|
+
if @sincedb_path.nil?
|
205
|
+
if ENV["SINCEDB_DIR"].nil? && ENV["HOME"].nil?
|
206
|
+
@logger.error("No SINCEDB_DIR or HOME environment variable set, I don't know where " \
|
207
|
+
"to keep track of the files I'm watching. Either set " \
|
208
|
+
"HOME or SINCEDB_DIR in your environment, or set sincedb_path in " \
|
209
|
+
"in your Logstash config for the file input with " \
|
210
|
+
"path '#{@path.inspect}'")
|
211
|
+
raise # TODO(sissel): HOW DO I FAIL PROPERLY YO
|
212
|
+
end
|
213
|
+
|
214
|
+
#pick SINCEDB_DIR if available, otherwise use HOME
|
215
|
+
sincedb_dir = ENV["SINCEDB_DIR"] || ENV["HOME"]
|
216
|
+
|
217
|
+
# Join by ',' to make it easy for folks to know their own sincedb
|
218
|
+
# generated path (vs, say, inspecting the @path array)
|
219
|
+
@sincedb_path = File.join(sincedb_dir, ".sincedb_" + Digest::MD5.hexdigest(@path.join(",")))
|
220
|
+
|
221
|
+
# Migrate any old .sincedb to the new file (this is for version <=1.1.1 compatibility)
|
222
|
+
old_sincedb = File.join(sincedb_dir, ".sincedb")
|
223
|
+
if File.exists?(old_sincedb)
|
224
|
+
@logger.info("Renaming old ~/.sincedb to new one", :old => old_sincedb,
|
225
|
+
:new => @sincedb_path)
|
226
|
+
File.rename(old_sincedb, @sincedb_path)
|
227
|
+
end
|
228
|
+
|
229
|
+
@logger.info("No sincedb_path set, generating one based on the file path",
|
230
|
+
:sincedb_path => @sincedb_path, :path => @path)
|
231
|
+
end
|
232
|
+
|
233
|
+
if File.directory?(@sincedb_path)
|
234
|
+
raise ArgumentError.new("The \"sincedb_path\" argument must point to a file, received a directory: \"#{@sincedb_path}\"")
|
235
|
+
end
|
236
|
+
|
103
237
|
@tail_config[:sincedb_path] = @sincedb_path
|
104
238
|
|
105
239
|
if @start_position == "beginning"
|
106
240
|
@tail_config[:start_new_files_at] = :beginning
|
107
241
|
end
|
108
242
|
|
109
|
-
@
|
243
|
+
@codec = LogStash::Codecs::IdentityMapCodec.new(@codec)
|
110
244
|
end # def register
|
111
245
|
|
112
|
-
|
113
|
-
|
114
|
-
|
246
|
+
class ListenerTail
|
247
|
+
# use attr_reader to define noop methods
|
248
|
+
attr_reader :input, :path, :data, :size, :pos
|
249
|
+
attr_reader :deleted, :created, :error, :eof
|
250
|
+
|
251
|
+
# construct with upstream state
|
252
|
+
def initialize(path, input)
|
253
|
+
@path, @input = path, input
|
254
|
+
end
|
255
|
+
|
256
|
+
def timed_out
|
257
|
+
input.codec.evict(path)
|
258
|
+
end
|
259
|
+
|
260
|
+
def accept(data, size, pos)
|
261
|
+
# and push transient data filled dup listener downstream
|
262
|
+
input.log_line_received(path, data)
|
263
|
+
input.codec.accept(dup_adding_state(data, size, pos))
|
264
|
+
end
|
265
|
+
|
266
|
+
def process_event(event)
|
267
|
+
event["[@metadata][size]"] = size unless size.nil?
|
268
|
+
event["[@metadata][pos]"] = pos unless pos.nil?
|
269
|
+
event["[@metadata][path]"] = path
|
270
|
+
event["path"] = path if !event.include?("path")
|
271
|
+
input.post_process_this(event)
|
272
|
+
end
|
273
|
+
|
274
|
+
def add_state(data, size, pos)
|
275
|
+
@data = data
|
276
|
+
@size = size
|
277
|
+
@pos = pos
|
278
|
+
self
|
279
|
+
end
|
280
|
+
|
281
|
+
private
|
282
|
+
|
283
|
+
# duplicate and add state for downstream
|
284
|
+
def dup_adding_state(line, size, pos)
|
285
|
+
self.class.new(path, input).add_state(line, size, pos)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
class FlushableListener < ListenerTail
|
290
|
+
attr_writer :path
|
291
|
+
end
|
292
|
+
|
293
|
+
def listener_for(path)
|
294
|
+
# path is the identity
|
295
|
+
ListenerTail.new(path, self)
|
296
|
+
end
|
297
|
+
|
298
|
+
def begin_tailing
|
299
|
+
# if the pipeline restarts this input,
|
300
|
+
# make sure previous files are closed
|
301
|
+
stop
|
302
|
+
# use observer listener api
|
303
|
+
@tail = FileWatch::Ext::Tail.new_observing_progress(@tail_config)
|
115
304
|
@tail.logger = @logger
|
116
305
|
@path.each { |path| @tail.tail(path) }
|
117
|
-
|
306
|
+
end
|
118
307
|
|
119
|
-
|
120
|
-
|
308
|
+
def run(queue)
|
309
|
+
begin_tailing
|
310
|
+
@queue = queue
|
311
|
+
@tail.subscribe(self)
|
312
|
+
exit_flush
|
313
|
+
end # def run
|
121
314
|
|
122
|
-
|
123
|
-
|
315
|
+
def post_process_this(event)
|
316
|
+
event["host"] = @host if !event.include?("host")
|
317
|
+
decorate(event)
|
318
|
+
@queue << event
|
319
|
+
end
|
124
320
|
|
125
|
-
|
126
|
-
|
127
|
-
|
321
|
+
def log_line_received(path, line)
|
322
|
+
return if !@logger.debug?
|
323
|
+
@logger.debug("Received line", :path => path, :text => line)
|
324
|
+
end
|
128
325
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
queue << event
|
140
|
-
end
|
141
|
-
end # if
|
142
|
-
end # subscribe
|
143
|
-
finished
|
144
|
-
end # def run
|
326
|
+
def stop
|
327
|
+
# in filewatch >= 0.6.7, quit will closes and forget all files
|
328
|
+
# but it will write their last read positions to since_db
|
329
|
+
# beforehand
|
330
|
+
if @tail
|
331
|
+
@codec.close
|
332
|
+
@tail.quit
|
333
|
+
end
|
334
|
+
end
|
145
335
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
336
|
+
private
|
337
|
+
|
338
|
+
def exit_flush
|
339
|
+
listener = FlushableListener.new("none", self)
|
340
|
+
if @codec.identity_count.zero?
|
341
|
+
# using the base codec without identity/path info
|
342
|
+
@codec.base_codec.flush do |event|
|
343
|
+
begin
|
344
|
+
listener.process_event(event)
|
345
|
+
rescue => e
|
346
|
+
@logger.error("File Input: flush on exit downstream error", :exception => e)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
else
|
350
|
+
@codec.flush_mapped(listener)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end # class LogStash::Inputs::File
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-file_progress'
|
4
|
-
s.version = '
|
4
|
+
s.version = '3.0.0'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Stream events from files with progress-events."
|
7
7
|
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
@@ -20,13 +20,16 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
|
21
21
|
|
22
22
|
# Gem dependencies
|
23
|
-
s.add_runtime_dependency "logstash-core", ">=
|
23
|
+
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.20", "<= 2.99"
|
24
24
|
|
25
|
-
s.add_runtime_dependency 'logstash-codec-
|
25
|
+
s.add_runtime_dependency 'logstash-codec-plain'
|
26
26
|
s.add_runtime_dependency 'addressable'
|
27
|
-
s.add_runtime_dependency "filewatch-ext", ["~>
|
28
|
-
|
27
|
+
s.add_runtime_dependency "filewatch-ext", ["~> 1.1.0"]
|
28
|
+
s.add_runtime_dependency 'logstash-codec-multiline', ['~> 2.0.7']
|
29
29
|
|
30
|
+
s.add_development_dependency 'stud', ['~> 0.0.19']
|
30
31
|
s.add_development_dependency 'logstash-devutils'
|
32
|
+
s.add_development_dependency 'logstash-codec-json'
|
33
|
+
s.add_development_dependency 'rspec-sequencing'
|
31
34
|
end
|
32
35
|
|
metadata
CHANGED
@@ -1,42 +1,42 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-file_progress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Signify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
16
|
- - '>='
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version:
|
19
|
-
- -
|
18
|
+
version: '1.20'
|
19
|
+
- - <=
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
22
|
-
name: logstash-core
|
21
|
+
version: '2.99'
|
22
|
+
name: logstash-core-plugin-api
|
23
23
|
prerelease: false
|
24
24
|
type: :runtime
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
- -
|
29
|
+
version: '1.20'
|
30
|
+
- - <=
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: '2.99'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
requirement: !ruby/object:Gem::Requirement
|
35
35
|
requirements:
|
36
36
|
- - '>='
|
37
37
|
- !ruby/object:Gem::Version
|
38
38
|
version: '0'
|
39
|
-
name: logstash-codec-
|
39
|
+
name: logstash-codec-plain
|
40
40
|
prerelease: false
|
41
41
|
type: :runtime
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -63,7 +63,7 @@ dependencies:
|
|
63
63
|
requirements:
|
64
64
|
- - ~>
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
66
|
+
version: 1.1.0
|
67
67
|
name: filewatch-ext
|
68
68
|
prerelease: false
|
69
69
|
type: :runtime
|
@@ -71,7 +71,35 @@ dependencies:
|
|
71
71
|
requirements:
|
72
72
|
- - ~>
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
74
|
+
version: 1.1.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ~>
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 2.0.7
|
81
|
+
name: logstash-codec-multiline
|
82
|
+
prerelease: false
|
83
|
+
type: :runtime
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 2.0.7
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ~>
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.0.19
|
95
|
+
name: stud
|
96
|
+
prerelease: false
|
97
|
+
type: :development
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.0.19
|
75
103
|
- !ruby/object:Gem::Dependency
|
76
104
|
requirement: !ruby/object:Gem::Requirement
|
77
105
|
requirements:
|
@@ -86,6 +114,34 @@ dependencies:
|
|
86
114
|
- - '>='
|
87
115
|
- !ruby/object:Gem::Version
|
88
116
|
version: '0'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
name: logstash-codec-json
|
124
|
+
prerelease: false
|
125
|
+
type: :development
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
name: rspec-sequencing
|
138
|
+
prerelease: false
|
139
|
+
type: :development
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - '>='
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
89
145
|
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
90
146
|
email: dietmar@signifydata.com
|
91
147
|
executables: []
|