logstash-lite 0.2.20101201111523 → 0.2.20101207114354
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.
- data/bin/logstash +19 -6
- data/etc/logstash-grep.yaml +31 -0
- data/etc/logstash-shipper.yaml +2 -1
- data/etc/logstash-stomp-input.yaml +7 -0
- data/etc/logstash-stomp.yaml +7 -0
- data/lib/logstash/agent.rb +21 -4
- data/lib/logstash/filters/base.rb +1 -0
- data/lib/logstash/filters/grep.rb +92 -0
- data/lib/logstash/inputs/base.rb +1 -0
- data/lib/logstash/inputs/stomp.rb +27 -0
- data/lib/logstash/outputs/base.rb +1 -0
- data/lib/logstash/outputs/stomp.rb +22 -0
- data/lib/logstash/outputs/websocket.rb +3 -3
- data/lib/logstash/stomp/handler.rb +34 -0
- metadata +11 -4
data/bin/logstash
CHANGED
@@ -8,7 +8,7 @@ require "logstash/agent"
|
|
8
8
|
require "optparse"
|
9
9
|
require "yaml"
|
10
10
|
|
11
|
-
Settings = Struct.new(:config_file, :daemonize)
|
11
|
+
Settings = Struct.new(:config_file, :daemonize, :logfile)
|
12
12
|
|
13
13
|
settings = Settings.new
|
14
14
|
settings.daemonize = false
|
@@ -23,9 +23,13 @@ opts = OptionParser.new do |opts|
|
|
23
23
|
settings.config_file = arg
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
opts.on("-d", "--daemonize", "Daemonize (default is run in foreground)") do
|
27
|
+
settings.daemonize = true
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on("-l", "--log FILE", "Log to a given path. Default is stdout.") do |path|
|
31
|
+
settings.logfile = path
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
begin
|
@@ -33,7 +37,6 @@ begin
|
|
33
37
|
if settings.config_file == "" or settings.config_file == nil
|
34
38
|
raise "No config file given. (missing -f or --config flag?)"
|
35
39
|
end
|
36
|
-
|
37
40
|
rescue
|
38
41
|
$stderr.puts "#{progname}: #{$!}"
|
39
42
|
$stderr.puts opts
|
@@ -52,5 +55,15 @@ rescue => e
|
|
52
55
|
exit 1
|
53
56
|
end
|
54
57
|
|
58
|
+
if settings.daemonize
|
59
|
+
if Process.fork == nil
|
60
|
+
Process.setsid
|
61
|
+
else
|
62
|
+
exit(0)
|
63
|
+
end
|
64
|
+
end
|
55
65
|
agent = LogStash::Agent.new(config)
|
56
|
-
|
66
|
+
if settings.logfile
|
67
|
+
agent.log_to(settings.logfile)
|
68
|
+
end
|
69
|
+
agent.run
|
@@ -0,0 +1,31 @@
|
|
1
|
+
---
|
2
|
+
inputs:
|
3
|
+
linux-syslog:
|
4
|
+
- /var/log/messages
|
5
|
+
filters:
|
6
|
+
- grok:
|
7
|
+
linux-syslog: # for logs of type 'linux-syslog'
|
8
|
+
patterns:
|
9
|
+
- %{SYSLOGLINE}
|
10
|
+
- date:
|
11
|
+
linux-syslog:
|
12
|
+
timestamp: "%b %e %H:%M:%S"
|
13
|
+
timestamp8601: ISO8601
|
14
|
+
- grep:
|
15
|
+
linux-syslog:
|
16
|
+
- match:
|
17
|
+
message: test
|
18
|
+
add_fields:
|
19
|
+
nagios_alert: test_alert
|
20
|
+
add_tags:
|
21
|
+
- nagios
|
22
|
+
- test
|
23
|
+
- match:
|
24
|
+
message: (?i)foo.*bar
|
25
|
+
program: test
|
26
|
+
add_fields:
|
27
|
+
nagios_alert: foo_alert
|
28
|
+
add_tags:
|
29
|
+
- nagios
|
30
|
+
outputs:
|
31
|
+
- stdout:///
|
data/etc/logstash-shipper.yaml
CHANGED
data/lib/logstash/agent.rb
CHANGED
@@ -14,7 +14,7 @@ class LogStash::Agent
|
|
14
14
|
attr_reader :filters
|
15
15
|
|
16
16
|
def initialize(config)
|
17
|
-
|
17
|
+
log_to(STDERR)
|
18
18
|
|
19
19
|
@config = config
|
20
20
|
@outputs = []
|
@@ -26,6 +26,11 @@ class LogStash::Agent
|
|
26
26
|
# - where to ship to
|
27
27
|
end # def initialize
|
28
28
|
|
29
|
+
public
|
30
|
+
def log_to(target)
|
31
|
+
@logger = LogStash::Logger.new(target)
|
32
|
+
end # def log_to
|
33
|
+
|
29
34
|
# Register any event handlers with EventMachine
|
30
35
|
# Technically, this agent could listen for anything (files, sockets, amqp,
|
31
36
|
# stomp, etc).
|
@@ -55,6 +60,7 @@ class LogStash::Agent
|
|
55
60
|
urls.each do |url|
|
56
61
|
@logger.debug("Using input #{url} of type #{type}")
|
57
62
|
input = LogStash::Inputs.from_url(url, type) { |event| receive(event) }
|
63
|
+
input.logger = @logger
|
58
64
|
input.register
|
59
65
|
@inputs << input
|
60
66
|
end
|
@@ -67,6 +73,7 @@ class LogStash::Agent
|
|
67
73
|
name, value = filter
|
68
74
|
@logger.debug("Using filter #{name} => #{value.inspect}")
|
69
75
|
filter = LogStash::Filters.from_name(name, value)
|
76
|
+
filter.logger = @logger
|
70
77
|
filter.register
|
71
78
|
@filters << filter
|
72
79
|
end # each filter
|
@@ -76,6 +83,7 @@ class LogStash::Agent
|
|
76
83
|
@config["outputs"].each do |url|
|
77
84
|
@logger.debug("Using output #{url}")
|
78
85
|
output = LogStash::Outputs.from_url(url)
|
86
|
+
output.logger = @logger
|
79
87
|
output.register
|
80
88
|
@outputs << output
|
81
89
|
end # each output
|
@@ -135,6 +143,10 @@ class LogStash::Agent
|
|
135
143
|
@sigchannel.push(:USR1)
|
136
144
|
end
|
137
145
|
|
146
|
+
Signal.trap("INT") do
|
147
|
+
@sigchannel.push(:INT)
|
148
|
+
end
|
149
|
+
|
138
150
|
@sigchannel.subscribe do |msg|
|
139
151
|
case msg
|
140
152
|
when :USR1
|
@@ -153,7 +165,12 @@ class LogStash::Agent
|
|
153
165
|
counts.sort { |a,b| a[1] <=> b[1] or a[0] <=> b[0] }.each do |key, value|
|
154
166
|
@logger.info("Class: [#{value}] #{key}")
|
155
167
|
end
|
156
|
-
|
157
|
-
|
158
|
-
|
168
|
+
when :INT
|
169
|
+
@logger.warn("SIGINT received. Shutting down.")
|
170
|
+
EventMachine::stop_event_loop
|
171
|
+
# TODO(sissel): Should have input/output/filter register shutdown
|
172
|
+
# hooks.
|
173
|
+
end # case msg
|
174
|
+
end # @sigchannel.subscribe
|
175
|
+
end # def sighandler
|
159
176
|
end # class LogStash::Components::Agent
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require "logstash/filters/base"
|
2
|
+
|
3
|
+
class LogStash::Filters::Grep < LogStash::Filters::Base
|
4
|
+
def initialize(config = {})
|
5
|
+
super
|
6
|
+
|
7
|
+
@config = config
|
8
|
+
end # def initialize
|
9
|
+
|
10
|
+
def register
|
11
|
+
@config.each do |type, matches|
|
12
|
+
if ! matches.is_a?(Array)
|
13
|
+
@logger.warn("grep: #{type} misconfigured; must be an array")
|
14
|
+
next
|
15
|
+
end
|
16
|
+
|
17
|
+
matches.each_index do |i|
|
18
|
+
match = matches[i]
|
19
|
+
if ! match.member?("match")
|
20
|
+
@logger.warn(["grep: #{type}/#{i}: no 'match' section defined", match])
|
21
|
+
next
|
22
|
+
end
|
23
|
+
match["match"].each do |field, re_str|
|
24
|
+
re = Regexp.new(re_str)
|
25
|
+
@config[type][i]["match"][field] = re
|
26
|
+
@logger.debug(["grep: #{type}/#{i}/#{field}", re_str, re])
|
27
|
+
end
|
28
|
+
end # matches.each
|
29
|
+
end # @config.each
|
30
|
+
end # def register
|
31
|
+
|
32
|
+
def filter(event)
|
33
|
+
config = @config[event.type]
|
34
|
+
if not config
|
35
|
+
@logger.debug("grep: skipping type #{event.type} from #{event.source}")
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
@logger.debug(["Running grep filter", event, config])
|
40
|
+
matched = false
|
41
|
+
config.each do |match|
|
42
|
+
if ! match["match"]
|
43
|
+
@logging.debug(["Skipping match object, no match key", match])
|
44
|
+
next
|
45
|
+
end
|
46
|
+
|
47
|
+
# For each match object, we have to match everything in order to
|
48
|
+
# apply any fields/tags.
|
49
|
+
match_count = 0
|
50
|
+
match["match"].each do |field, re|
|
51
|
+
next unless event[field]
|
52
|
+
|
53
|
+
event[field].each do |value|
|
54
|
+
next unless re.match(value)
|
55
|
+
@logger.debug("grep matched on field #{field}")
|
56
|
+
match_count += 1
|
57
|
+
end
|
58
|
+
end # match["match"].each
|
59
|
+
|
60
|
+
if match_count == match["match"].length
|
61
|
+
matched = true
|
62
|
+
@logger.debug("matched all fields (#{match_count})")
|
63
|
+
|
64
|
+
if match["add_fields"]
|
65
|
+
match["add_fields"].each do |field, value|
|
66
|
+
event[field] ||= []
|
67
|
+
event[field] << value
|
68
|
+
@logger.debug("grep: adding #{value} to field #{field}")
|
69
|
+
end
|
70
|
+
end # if match["add_fields"]
|
71
|
+
|
72
|
+
if match["add_tags"]
|
73
|
+
match["add_tags"].each do |tag|
|
74
|
+
event.tags << tag
|
75
|
+
@logger.debug("grep: adding tag #{tag}")
|
76
|
+
end
|
77
|
+
end # if match["add_tags"]
|
78
|
+
else
|
79
|
+
@logger.debug("match block failed " \
|
80
|
+
"(#{match_count}/#{match["match"].length} matches)")
|
81
|
+
end # match["match"].each
|
82
|
+
end # config.each
|
83
|
+
|
84
|
+
if not matched
|
85
|
+
@logger.debug("grep: dropping event, no matches")
|
86
|
+
event.cancel
|
87
|
+
return
|
88
|
+
end
|
89
|
+
|
90
|
+
@logger.debug(["Event after grep filter", event.to_hash])
|
91
|
+
end # def filter
|
92
|
+
end # class LogStash::Filters::Grep
|
data/lib/logstash/inputs/base.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "logstash/inputs/base"
|
2
|
+
require "logstash/stomp/handler"
|
3
|
+
|
4
|
+
class LogStash::Inputs::Stomp < LogStash::Inputs::Base
|
5
|
+
|
6
|
+
class InputHandler < LogStash::Stomp::Handler
|
7
|
+
def receive_msg(message)
|
8
|
+
super
|
9
|
+
|
10
|
+
unless message.command == "CONNECTED"
|
11
|
+
event = LogStash::Event.from_json(message.body)
|
12
|
+
@input.receive(event)
|
13
|
+
end
|
14
|
+
end # def receive_msg
|
15
|
+
end # class StompHandler
|
16
|
+
|
17
|
+
def initialize(url, config={}, &block)
|
18
|
+
super
|
19
|
+
|
20
|
+
@logger.debug(["Connecting", { :url => @url }])
|
21
|
+
end # def initialize
|
22
|
+
|
23
|
+
def register
|
24
|
+
@logger.info(["Registering input", { :url => @url}])
|
25
|
+
EventMachine::connect(@url.host, @url.port, InputHandler, self, @logger, @url)
|
26
|
+
end # def register
|
27
|
+
end # class LogStash::Inputs::Amqp
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "logstash/outputs/base"
|
2
|
+
require "logstash/stomp/handler"
|
3
|
+
|
4
|
+
class LogStash::Outputs::Stomp < LogStash::Outputs::Base
|
5
|
+
attr_reader :url
|
6
|
+
|
7
|
+
def initialize(url, config={}, &block)
|
8
|
+
super
|
9
|
+
|
10
|
+
@logger.debug(["Initialize", { :url => @url }])
|
11
|
+
end # def initialize
|
12
|
+
|
13
|
+
def register
|
14
|
+
@logger.info(["Registering output", { :url => @url }])
|
15
|
+
@connection = EventMachine::connect(@url.host, @url.port, LogStash::Stomp::Handler, self, @logger, @url)
|
16
|
+
end # def register
|
17
|
+
|
18
|
+
def receive(event)
|
19
|
+
@logger.debug(["Sending event", { :url => @url, :event => event }])
|
20
|
+
@connection.send(@url.path, event.to_json)
|
21
|
+
end # def receive
|
22
|
+
end # class LogStash::Outputs::Stomp
|
@@ -9,10 +9,10 @@ class LogStash::Outputs::Websocket < LogStash::Outputs::Base
|
|
9
9
|
def register
|
10
10
|
@channel = EventMachine::Channel.new
|
11
11
|
@subscribers = 0
|
12
|
-
host = (@url.host or "0.0.0.0")
|
13
|
-
port = (@url.port or
|
12
|
+
@url.host = (@url.host or "0.0.0.0")
|
13
|
+
@url.port = (@url.port or 3232)
|
14
14
|
@logger.info("Registering websocket on #{@url}")
|
15
|
-
EventMachine::WebSocket.start(:host => host, :port => port) do |ws|
|
15
|
+
EventMachine::WebSocket.start(:host => @url.host, :port => @url.port) do |ws|
|
16
16
|
ws.onopen do
|
17
17
|
@subscribers += 1
|
18
18
|
@logger.info("New #{self.class.name} connection")
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Base of Stomp Handler
|
2
|
+
# it handles connecting and subscribing to the stomp broker which
|
3
|
+
# is used in both stomp input and output
|
4
|
+
class LogStash::Stomp
|
5
|
+
class Handler < EventMachine::Connection
|
6
|
+
include EM::Protocols::Stomp
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
super
|
10
|
+
|
11
|
+
@input = args[0]
|
12
|
+
@logger = args[1]
|
13
|
+
@url = args[2]
|
14
|
+
end # def initialize
|
15
|
+
|
16
|
+
def connection_completed
|
17
|
+
@logger.debug("Connected")
|
18
|
+
connect :login => @url.user, :passcode => @url.password
|
19
|
+
end # def connection_completed
|
20
|
+
|
21
|
+
def unbind
|
22
|
+
@logger.error(["Error when connecting to stomp broker", { :url => @url }])
|
23
|
+
end # def unbind
|
24
|
+
|
25
|
+
def receive_msg(message)
|
26
|
+
@logger.debug(["receiving message", { :msg => message }])
|
27
|
+
if message.command == "CONNECTED"
|
28
|
+
@logger.debug(["subscribing to", { :path => @url.path }])
|
29
|
+
subscribe @url.path
|
30
|
+
return
|
31
|
+
end
|
32
|
+
end # def receive_msg
|
33
|
+
end # class Handler
|
34
|
+
end # class LogStash::Stomp
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 40202414228723
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 20101207114354
|
10
|
+
version: 0.2.20101207114354
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jordan Sissel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-07 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- lib/logstash/inputs/file.rb
|
95
95
|
- lib/logstash/inputs/base.rb
|
96
96
|
- lib/logstash/inputs/amqp.rb
|
97
|
+
- lib/logstash/inputs/stomp.rb
|
97
98
|
- lib/logstash/inputs/tcp.rb
|
98
99
|
- lib/logstash/outputs/gelf.rb
|
99
100
|
- lib/logstash/outputs/elasticsearch.rb
|
@@ -103,14 +104,17 @@ files:
|
|
103
104
|
- lib/logstash/outputs/websocket.rb
|
104
105
|
- lib/logstash/outputs/base.rb
|
105
106
|
- lib/logstash/outputs/amqp.rb
|
107
|
+
- lib/logstash/outputs/stomp.rb
|
106
108
|
- lib/logstash/outputs/tcp.rb
|
107
109
|
- lib/logstash/namespace.rb
|
108
110
|
- lib/logstash/time.rb
|
109
111
|
- lib/logstash/filters.rb
|
110
112
|
- lib/logstash/outputs.rb
|
113
|
+
- lib/logstash/stomp/handler.rb
|
111
114
|
- lib/logstash/filters/grokdiscovery.rb
|
112
115
|
- lib/logstash/filters/multiline.rb
|
113
116
|
- lib/logstash/filters/grok.rb
|
117
|
+
- lib/logstash/filters/grep.rb
|
114
118
|
- lib/logstash/filters/base.rb
|
115
119
|
- lib/logstash/filters/field.rb
|
116
120
|
- lib/logstash/filters/date.rb
|
@@ -208,6 +212,7 @@ files:
|
|
208
212
|
- etc/tograylog.yaml
|
209
213
|
- etc/logstash-elasticsearch-rabbitmq-river.yaml
|
210
214
|
- etc/logstash-reader.yaml
|
215
|
+
- etc/logstash-stomp-input.yaml
|
211
216
|
- etc/logstash-parser.yaml
|
212
217
|
- etc/logstash-mongodb-storage.yaml
|
213
218
|
- etc/logstash-standalone.yaml
|
@@ -216,7 +221,9 @@ files:
|
|
216
221
|
- etc/redhat/logstash.spec
|
217
222
|
- etc/redhat/logstash
|
218
223
|
- etc/redhat/logstash-agent
|
224
|
+
- etc/logstash-stomp.yaml
|
219
225
|
- etc/prod.yaml
|
226
|
+
- etc/logstash-grep.yaml
|
220
227
|
- etc/logstash-shipper.yaml
|
221
228
|
- patterns/linux-syslog
|
222
229
|
- patterns/haproxy
|