logstash-input-tcp 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/logstash/inputs/tcp.rb +33 -34
- data/logstash-input-tcp.gemspec +1 -1
- data/spec/inputs/tcp_spec.rb +82 -114
- metadata +22 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ccc75be3eea6fc13e2bf56bc7faef1dcce3b73d
|
4
|
+
data.tar.gz: a145775968ea16c80e66e175f252c9fd4cb4f46c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e0775708e8493ce73c417fb3aee887f5de16a8c6d1f2424ac806261407990a9bddfdb7cc5e0b6b31a91916fb2aa55c3bc0781d552c2082f53dd58e8cbf979b1
|
7
|
+
data.tar.gz: 59ae84706c2118eb28193b622c87a334a0eaaf5ee1c85c48cb6955392d68e0eb3a6540faa43d072e6f937c81e60449767bf8ef3a4de9edd298de2187ddf2a15d
|
data/lib/logstash/inputs/tcp.rb
CHANGED
@@ -10,7 +10,6 @@ require "logstash/util/socket_peer"
|
|
10
10
|
# Can either accept connections from clients or connect to a server,
|
11
11
|
# depending on `mode`.
|
12
12
|
class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
13
|
-
class Interrupted < StandardError; end
|
14
13
|
config_name "tcp"
|
15
14
|
|
16
15
|
default :codec, "line"
|
@@ -54,6 +53,9 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
54
53
|
|
55
54
|
def initialize(*args)
|
56
55
|
super(*args)
|
56
|
+
@interrupted = false
|
57
|
+
@server_socket = nil
|
58
|
+
@client_socket = nil
|
57
59
|
end # def initialize
|
58
60
|
|
59
61
|
public
|
@@ -102,10 +104,10 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
102
104
|
|
103
105
|
private
|
104
106
|
def handle_socket(socket, client_address, output_queue, codec)
|
105
|
-
while
|
107
|
+
while !@interrupted
|
106
108
|
buf = nil
|
107
109
|
# NOTE(petef): the timeout only hits after the line is read or socket dies
|
108
|
-
# TODO(sissel): Why do we have a
|
110
|
+
# TODO(sissel): Why do we have a Timeout here? What's the point?
|
109
111
|
if @data_timeout == -1
|
110
112
|
buf = read(socket)
|
111
113
|
else
|
@@ -143,7 +145,8 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
143
145
|
begin
|
144
146
|
@logger.debug? && @logger.debug("Accepted connection", :client => s.peer, :server => "#{@host}:#{@port}")
|
145
147
|
handle_socket(s, s.peeraddr[3], q, @codec.clone)
|
146
|
-
rescue
|
148
|
+
rescue LogStash::ShutdownSignal
|
149
|
+
@interrupted = true
|
147
150
|
s.close rescue nil
|
148
151
|
ensure
|
149
152
|
@client_threads_lock.synchronize{@client_threads.delete(Thread.current)}
|
@@ -158,7 +161,7 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
158
161
|
|
159
162
|
private
|
160
163
|
def read(socket)
|
161
|
-
|
164
|
+
socket.sysread(16384)
|
162
165
|
end # def readline
|
163
166
|
|
164
167
|
public
|
@@ -171,11 +174,10 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
171
174
|
end # def run
|
172
175
|
|
173
176
|
def run_server(output_queue)
|
174
|
-
@thread = Thread.current
|
175
177
|
@client_threads = []
|
176
178
|
@client_threads_lock = Mutex.new
|
177
179
|
|
178
|
-
while
|
180
|
+
while !@interrupted
|
179
181
|
begin
|
180
182
|
socket = @server_socket.accept
|
181
183
|
# start a new thread for each connection.
|
@@ -183,37 +185,28 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
183
185
|
rescue OpenSSL::SSL::SSLError => ssle
|
184
186
|
# NOTE(mrichar1): This doesn't return a useful error message for some reason
|
185
187
|
@logger.error("SSL Error", :exception => ssle, :backtrace => ssle.backtrace)
|
186
|
-
rescue IOError
|
187
|
-
|
188
|
-
@server_socket.close rescue nil
|
189
|
-
|
190
|
-
threads = @client_threads_lock.synchronize{@client_threads.dup}
|
191
|
-
threads.each do |thread|
|
192
|
-
thread.raise(LogStash::ShutdownSignal) if thread.alive?
|
193
|
-
end
|
194
|
-
|
195
|
-
# intended shutdown, get out of the loop
|
196
|
-
break
|
197
|
-
else
|
198
|
-
# it was a genuine IOError, propagate it up
|
199
|
-
raise
|
200
|
-
end
|
188
|
+
rescue IOError
|
189
|
+
raise unless @interrupted
|
201
190
|
end
|
202
|
-
end
|
191
|
+
end
|
203
192
|
rescue LogStash::ShutdownSignal
|
204
|
-
|
193
|
+
@interrupted = true
|
205
194
|
ensure
|
206
195
|
@server_socket.close rescue nil
|
196
|
+
|
197
|
+
threads = @client_threads_lock.synchronize{@client_threads.dup}
|
198
|
+
threads.each do |thread|
|
199
|
+
thread.raise(LogStash::ShutdownSignal) if thread.alive?
|
200
|
+
end
|
207
201
|
end # def run_server
|
208
202
|
|
209
203
|
def run_client(output_queue)
|
210
|
-
|
211
|
-
|
212
|
-
client_socket = TCPSocket.new(@host, @port)
|
204
|
+
while !@interrupted
|
205
|
+
@client_socket = TCPSocket.new(@host, @port)
|
213
206
|
if @ssl_enable
|
214
|
-
client_socket = OpenSSL::SSL::SSLSocket.new(client_socket, @ssl_context)
|
207
|
+
@client_socket = OpenSSL::SSL::SSLSocket.new(@client_socket, @ssl_context)
|
215
208
|
begin
|
216
|
-
client_socket.connect
|
209
|
+
@client_socket.connect
|
217
210
|
rescue OpenSSL::SSL::SSLError => ssle
|
218
211
|
@logger.error("SSL Error", :exception => ssle, :backtrace => ssle.backtrace)
|
219
212
|
# NOTE(mrichar1): Hack to prevent hammering peer
|
@@ -221,17 +214,23 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
|
|
221
214
|
next
|
222
215
|
end
|
223
216
|
end
|
224
|
-
@logger.debug("Opened connection", :client => "#{client_socket.peer}")
|
225
|
-
handle_socket(client_socket, client_socket.peeraddr[3], output_queue, @codec.clone)
|
217
|
+
@logger.debug? && @logger.debug("Opened connection", :client => "#{@client_socket.peer}")
|
218
|
+
handle_socket(@client_socket, @client_socket.peeraddr[3], output_queue, @codec.clone)
|
226
219
|
end # loop
|
227
220
|
ensure
|
228
|
-
client_socket.close rescue nil
|
221
|
+
@client_socket.close rescue nil
|
229
222
|
end # def run
|
230
223
|
|
231
224
|
public
|
232
225
|
def teardown
|
233
|
-
|
234
|
-
|
226
|
+
@interrupted = true
|
227
|
+
if @server_socket
|
228
|
+
@server_socket.close rescue nil
|
229
|
+
@server_socket = nil
|
230
|
+
end
|
231
|
+
if @client_socket
|
232
|
+
@client_socket.close rescue nil
|
233
|
+
@client_socket = nil
|
235
234
|
end
|
236
235
|
end # def teardown
|
237
236
|
end # class LogStash::Inputs::Tcp
|
data/logstash-input-tcp.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-tcp'
|
4
|
-
s.version = '0.1.
|
4
|
+
s.version = '0.1.4'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Read events over a TCP socket."
|
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"
|
data/spec/inputs/tcp_spec.rb
CHANGED
@@ -7,7 +7,7 @@ require "logstash/inputs/tcp"
|
|
7
7
|
require 'stud/try'
|
8
8
|
|
9
9
|
describe LogStash::Inputs::Tcp do
|
10
|
-
|
10
|
+
|
11
11
|
|
12
12
|
context "codec (PR #1372)" do
|
13
13
|
it "switches from plain to line" do
|
@@ -16,6 +16,7 @@ describe LogStash::Inputs::Tcp do
|
|
16
16
|
plugin = LogStash::Inputs::Tcp.new("codec" => LogStash::Codecs::Plain.new, "port" => 0)
|
17
17
|
plugin.register
|
18
18
|
insist { plugin.codec }.is_a?(LogStash::Codecs::Line)
|
19
|
+
plugin.teardown
|
19
20
|
end
|
20
21
|
it "switches from json to json_lines" do
|
21
22
|
require "logstash/codecs/json"
|
@@ -23,13 +24,14 @@ describe LogStash::Inputs::Tcp do
|
|
23
24
|
plugin = LogStash::Inputs::Tcp.new("codec" => LogStash::Codecs::JSON.new, "port" => 0)
|
24
25
|
plugin.register
|
25
26
|
insist { plugin.codec }.is_a?(LogStash::Codecs::JSONLines)
|
27
|
+
plugin.teardown
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
|
-
|
31
|
+
it "should read plain with unicode" do
|
30
32
|
event_count = 10
|
31
33
|
port = 5511
|
32
|
-
|
34
|
+
conf = <<-CONFIG
|
33
35
|
input {
|
34
36
|
tcp {
|
35
37
|
port => #{port}
|
@@ -37,31 +39,30 @@ describe LogStash::Inputs::Tcp do
|
|
37
39
|
}
|
38
40
|
CONFIG
|
39
41
|
|
40
|
-
input do |pipeline, queue|
|
41
|
-
Thread.new { pipeline.run }
|
42
|
-
sleep 0.1 while !pipeline.ready?
|
43
42
|
|
43
|
+
|
44
|
+
events = input(conf) do |pipeline, queue|
|
44
45
|
socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
|
45
46
|
event_count.times do |i|
|
46
47
|
# unicode smiley for testing unicode support!
|
47
48
|
socket.puts("#{i} ☹")
|
49
|
+
socket.flush
|
48
50
|
end
|
49
51
|
socket.close
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
+
event_count.times.collect {queue.pop}
|
54
|
+
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end # input
|
56
|
+
insist { events.length } == event_count
|
57
|
+
event_count.times do |i|
|
58
|
+
insist { events[i]["message"] } == "#{i} ☹"
|
59
|
+
end
|
59
60
|
end
|
60
61
|
|
61
|
-
|
62
|
+
it "should read events with plain codec and ISO-8859-1 charset" do
|
62
63
|
port = 5513
|
63
64
|
charset = "ISO-8859-1"
|
64
|
-
|
65
|
+
conf = <<-CONFIG
|
65
66
|
input {
|
66
67
|
tcp {
|
67
68
|
port => #{port}
|
@@ -70,32 +71,25 @@ describe LogStash::Inputs::Tcp do
|
|
70
71
|
}
|
71
72
|
CONFIG
|
72
73
|
|
73
|
-
input do |pipeline, queue|
|
74
|
-
Thread.new { pipeline.run }
|
75
|
-
sleep 0.1 while !pipeline.ready?
|
76
|
-
|
74
|
+
event = input(conf) do |pipeline, queue|
|
77
75
|
socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
|
78
76
|
text = "\xA3" # the £ symbol in ISO-8859-1 aka Latin-1
|
79
77
|
text.force_encoding("ISO-8859-1")
|
80
78
|
socket.puts(text)
|
81
79
|
socket.close
|
82
80
|
|
83
|
-
|
84
|
-
|
81
|
+
queue.pop
|
82
|
+
end
|
85
83
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
insist { event["message"].bytesize } == 2
|
91
|
-
insist { event["message"] } == "£"
|
92
|
-
end
|
93
|
-
end # input
|
84
|
+
# Make sure the 0xA3 latin-1 code converts correctly to UTF-8.
|
85
|
+
insist { event["message"].size } == 1
|
86
|
+
insist { event["message"].bytesize } == 2
|
87
|
+
insist { event["message"] } == "£"
|
94
88
|
end
|
95
89
|
|
96
|
-
|
90
|
+
it "should read events with json codec" do
|
97
91
|
port = 5514
|
98
|
-
|
92
|
+
conf = <<-CONFIG
|
99
93
|
input {
|
100
94
|
tcp {
|
101
95
|
port => #{port}
|
@@ -104,38 +98,33 @@ describe LogStash::Inputs::Tcp do
|
|
104
98
|
}
|
105
99
|
CONFIG
|
106
100
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
"foo" => [1,2,3],
|
114
|
-
"baz" => { "1" => "2" },
|
115
|
-
"host" => "example host"
|
116
|
-
}
|
101
|
+
data = {
|
102
|
+
"hello" => "world",
|
103
|
+
"foo" => [1,2,3],
|
104
|
+
"baz" => { "1" => "2" },
|
105
|
+
"host" => "example host"
|
106
|
+
}
|
117
107
|
|
108
|
+
event = input(conf) do |pipeline, queue|
|
118
109
|
socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
|
119
110
|
socket.puts(LogStash::Json.dump(data))
|
120
111
|
socket.close
|
121
112
|
|
122
|
-
|
123
|
-
|
113
|
+
queue.pop
|
114
|
+
end
|
124
115
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
insist { event["baz"] } == data["baz"]
|
116
|
+
insist { event["hello"] } == data["hello"]
|
117
|
+
insist { event["foo"].to_a } == data["foo"] # to_a to cast Java ArrayList produced by JrJackson
|
118
|
+
insist { event["baz"] } == data["baz"]
|
129
119
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
end # input
|
120
|
+
# Make sure the tcp input, w/ json codec, uses the event's 'host' value,
|
121
|
+
# if present, instead of providing its own
|
122
|
+
insist { event["host"] } == data["host"]
|
134
123
|
end
|
135
124
|
|
136
|
-
|
125
|
+
it "should read events with json codec (testing 'host' handling)" do
|
137
126
|
port = 5514
|
138
|
-
|
127
|
+
conf = <<-CONFIG
|
139
128
|
input {
|
140
129
|
tcp {
|
141
130
|
port => #{port}
|
@@ -144,30 +133,25 @@ describe LogStash::Inputs::Tcp do
|
|
144
133
|
}
|
145
134
|
CONFIG
|
146
135
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
data = {
|
152
|
-
"hello" => "world"
|
153
|
-
}
|
136
|
+
data = {
|
137
|
+
"hello" => "world"
|
138
|
+
}
|
154
139
|
|
140
|
+
event = input(conf) do |pipeline, queue|
|
155
141
|
socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
|
156
142
|
socket.puts(LogStash::Json.dump(data))
|
157
143
|
socket.close
|
158
144
|
|
159
|
-
|
160
|
-
|
145
|
+
queue.pop
|
146
|
+
end
|
161
147
|
|
162
|
-
|
163
|
-
|
164
|
-
insist { event }.include?("host")
|
165
|
-
end # input
|
148
|
+
insist { event["hello"] } == data["hello"]
|
149
|
+
insist { event }.include?("host")
|
166
150
|
end
|
167
151
|
|
168
|
-
|
152
|
+
it "should read events with json_lines codec" do
|
169
153
|
port = 5515
|
170
|
-
|
154
|
+
conf = <<-CONFIG
|
171
155
|
input {
|
172
156
|
tcp {
|
173
157
|
port => #{port}
|
@@ -176,38 +160,36 @@ describe LogStash::Inputs::Tcp do
|
|
176
160
|
}
|
177
161
|
CONFIG
|
178
162
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
"foo" => [1,2,3],
|
186
|
-
"baz" => { "1" => "2" },
|
187
|
-
"idx" => 0
|
188
|
-
}
|
163
|
+
data = {
|
164
|
+
"hello" => "world",
|
165
|
+
"foo" => [1,2,3],
|
166
|
+
"baz" => { "1" => "2" },
|
167
|
+
"idx" => 0
|
168
|
+
}
|
189
169
|
|
170
|
+
events = input(conf) do |pipeline, queue|
|
190
171
|
socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
|
191
172
|
(1..5).each do |idx|
|
192
173
|
data["idx"] = idx
|
193
174
|
socket.puts(LogStash::Json.dump(data) + "\n")
|
194
|
-
end
|
175
|
+
end
|
195
176
|
socket.close
|
196
177
|
|
197
|
-
(1..5).
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
178
|
+
(1..5).map{queue.pop}
|
179
|
+
end
|
180
|
+
|
181
|
+
events.each_with_index do |event, idx|
|
182
|
+
insist { event["hello"] } == data["hello"]
|
183
|
+
insist { event["foo"].to_a } == data["foo"] # to_a to cast Java ArrayList produced by JrJackson
|
184
|
+
insist { event["baz"] } == data["baz"]
|
185
|
+
insist { event["idx"] } == idx + 1
|
186
|
+
end # do
|
205
187
|
end # describe
|
206
188
|
|
207
|
-
|
189
|
+
it "should one message per connection" do
|
208
190
|
event_count = 10
|
209
191
|
port = 5516
|
210
|
-
|
192
|
+
conf = <<-CONFIG
|
211
193
|
input {
|
212
194
|
tcp {
|
213
195
|
port => #{port}
|
@@ -215,33 +197,27 @@ describe LogStash::Inputs::Tcp do
|
|
215
197
|
}
|
216
198
|
CONFIG
|
217
199
|
|
218
|
-
input do |pipeline, queue|
|
219
|
-
Thread.new { pipeline.run }
|
220
|
-
sleep 0.1 while !pipeline.ready?
|
221
|
-
|
200
|
+
events = input(conf) do |pipeline, queue|
|
222
201
|
event_count.times do |i|
|
223
202
|
socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
|
224
203
|
socket.puts("#{i}")
|
225
204
|
socket.flush
|
226
205
|
socket.close
|
227
206
|
end
|
228
|
-
|
229
|
-
# wait till all events have been processed
|
230
|
-
Timeout.timeout(1) {sleep 0.1 while queue.size < event_count}
|
231
207
|
|
232
208
|
# since each message is sent on its own tcp connection & thread, exact receiving order cannot be garanteed
|
233
|
-
|
209
|
+
event_count.times.collect{queue.pop}.sort_by{|event| event["message"]}
|
210
|
+
end
|
234
211
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
end # input
|
212
|
+
event_count.times do |i|
|
213
|
+
insist { events[i]["message"] } == "#{i}"
|
214
|
+
end
|
239
215
|
end
|
240
216
|
|
241
|
-
|
217
|
+
it "should connection threads are cleaned up when connection is closed" do
|
242
218
|
event_count = 10
|
243
219
|
port = 5517
|
244
|
-
|
220
|
+
conf = <<-CONFIG
|
245
221
|
input {
|
246
222
|
tcp {
|
247
223
|
port => #{port}
|
@@ -249,10 +225,7 @@ describe LogStash::Inputs::Tcp do
|
|
249
225
|
}
|
250
226
|
CONFIG
|
251
227
|
|
252
|
-
input do |pipeline, queue|
|
253
|
-
Thread.new { pipeline.run }
|
254
|
-
sleep 0.1 while !pipeline.ready?
|
255
|
-
|
228
|
+
input(conf) do |pipeline, queue|
|
256
229
|
inputs = pipeline.instance_variable_get("@inputs")
|
257
230
|
insist { inputs.size } == 1
|
258
231
|
|
@@ -263,18 +236,13 @@ describe LogStash::Inputs::Tcp do
|
|
263
236
|
socket
|
264
237
|
end
|
265
238
|
|
266
|
-
# wait till all events have been processed
|
267
|
-
Timeout.timeout(1) {sleep 0.1 while queue.size < event_count}
|
268
|
-
|
269
|
-
# we should have "event_count" pending threads since sockets were not closed yet
|
270
239
|
client_threads = inputs[0].instance_variable_get("@client_threads")
|
271
|
-
insist { client_threads.size } == event_count
|
272
240
|
|
273
241
|
# close all sockets and make sure there is not more pending threads
|
274
242
|
sockets.each{|socket| socket.close}
|
243
|
+
|
275
244
|
Timeout.timeout(1) {sleep 0.1 while client_threads.size > 0}
|
276
245
|
insist { client_threads.size } == 0 # this check is actually useless per previous line
|
277
|
-
|
278
|
-
end # input
|
246
|
+
end
|
279
247
|
end
|
280
248
|
end
|
metadata
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-tcp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elasticsearch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
|
14
|
+
name: logstash-core
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - '>='
|
17
18
|
- !ruby/object:Gem::Version
|
@@ -19,10 +20,7 @@ dependencies:
|
|
19
20
|
- - <
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 2.0.0
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
type: :runtime
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
26
24
|
requirements:
|
27
25
|
- - '>='
|
28
26
|
- !ruby/object:Gem::Version
|
@@ -30,76 +28,78 @@ dependencies:
|
|
30
28
|
- - <
|
31
29
|
- !ruby/object:Gem::Version
|
32
30
|
version: 2.0.0
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
+
name: logstash-codec-plain
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
34
40
|
requirement: !ruby/object:Gem::Requirement
|
35
41
|
requirements:
|
36
42
|
- - '>='
|
37
43
|
- !ruby/object:Gem::Version
|
38
44
|
version: '0'
|
39
|
-
name: logstash-codec-plain
|
40
45
|
prerelease: false
|
41
46
|
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: logstash-codec-line
|
42
49
|
version_requirements: !ruby/object:Gem::Requirement
|
43
50
|
requirements:
|
44
51
|
- - '>='
|
45
52
|
- !ruby/object:Gem::Version
|
46
53
|
version: '0'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
54
|
requirement: !ruby/object:Gem::Requirement
|
49
55
|
requirements:
|
50
56
|
- - '>='
|
51
57
|
- !ruby/object:Gem::Version
|
52
58
|
version: '0'
|
53
|
-
name: logstash-codec-line
|
54
59
|
prerelease: false
|
55
60
|
type: :runtime
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: logstash-codec-json
|
56
63
|
version_requirements: !ruby/object:Gem::Requirement
|
57
64
|
requirements:
|
58
65
|
- - '>='
|
59
66
|
- !ruby/object:Gem::Version
|
60
67
|
version: '0'
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
68
|
requirement: !ruby/object:Gem::Requirement
|
63
69
|
requirements:
|
64
70
|
- - '>='
|
65
71
|
- !ruby/object:Gem::Version
|
66
72
|
version: '0'
|
67
|
-
name: logstash-codec-json
|
68
73
|
prerelease: false
|
69
74
|
type: :runtime
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: logstash-codec-json_lines
|
70
77
|
version_requirements: !ruby/object:Gem::Requirement
|
71
78
|
requirements:
|
72
79
|
- - '>='
|
73
80
|
- !ruby/object:Gem::Version
|
74
81
|
version: '0'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
82
|
requirement: !ruby/object:Gem::Requirement
|
77
83
|
requirements:
|
78
84
|
- - '>='
|
79
85
|
- !ruby/object:Gem::Version
|
80
86
|
version: '0'
|
81
|
-
name: logstash-codec-json_lines
|
82
87
|
prerelease: false
|
83
88
|
type: :runtime
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: logstash-devutils
|
84
91
|
version_requirements: !ruby/object:Gem::Requirement
|
85
92
|
requirements:
|
86
93
|
- - '>='
|
87
94
|
- !ruby/object:Gem::Version
|
88
95
|
version: '0'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
96
|
requirement: !ruby/object:Gem::Requirement
|
91
97
|
requirements:
|
92
98
|
- - '>='
|
93
99
|
- !ruby/object:Gem::Version
|
94
100
|
version: '0'
|
95
|
-
name: logstash-devutils
|
96
101
|
prerelease: false
|
97
102
|
type: :development
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - '>='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
103
|
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
|
104
104
|
email: info@elasticsearch.com
|
105
105
|
executables: []
|
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
137
|
version: '0'
|
138
138
|
requirements: []
|
139
139
|
rubyforge_project:
|
140
|
-
rubygems_version: 2.
|
140
|
+
rubygems_version: 2.1.9
|
141
141
|
signing_key:
|
142
142
|
specification_version: 4
|
143
143
|
summary: Read events over a TCP socket.
|