logstash-core 2.2.4.snapshot1
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.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/lib/logstash-core.rb +1 -0
- data/lib/logstash-core/logstash-core.rb +3 -0
- data/lib/logstash-core/version.rb +8 -0
- data/lib/logstash/agent.rb +391 -0
- data/lib/logstash/codecs/base.rb +50 -0
- data/lib/logstash/config/config_ast.rb +550 -0
- data/lib/logstash/config/cpu_core_strategy.rb +32 -0
- data/lib/logstash/config/defaults.rb +12 -0
- data/lib/logstash/config/file.rb +39 -0
- data/lib/logstash/config/grammar.rb +3503 -0
- data/lib/logstash/config/mixin.rb +518 -0
- data/lib/logstash/config/registry.rb +13 -0
- data/lib/logstash/environment.rb +98 -0
- data/lib/logstash/errors.rb +12 -0
- data/lib/logstash/filters/base.rb +205 -0
- data/lib/logstash/inputs/base.rb +116 -0
- data/lib/logstash/inputs/threadable.rb +18 -0
- data/lib/logstash/java_integration.rb +116 -0
- data/lib/logstash/json.rb +61 -0
- data/lib/logstash/logging.rb +91 -0
- data/lib/logstash/namespace.rb +13 -0
- data/lib/logstash/output_delegator.rb +172 -0
- data/lib/logstash/outputs/base.rb +91 -0
- data/lib/logstash/patches.rb +5 -0
- data/lib/logstash/patches/bugfix_jruby_2558.rb +51 -0
- data/lib/logstash/patches/cabin.rb +35 -0
- data/lib/logstash/patches/profile_require_calls.rb +47 -0
- data/lib/logstash/patches/rubygems.rb +38 -0
- data/lib/logstash/patches/stronger_openssl_defaults.rb +68 -0
- data/lib/logstash/pipeline.rb +499 -0
- data/lib/logstash/pipeline_reporter.rb +114 -0
- data/lib/logstash/plugin.rb +120 -0
- data/lib/logstash/program.rb +14 -0
- data/lib/logstash/runner.rb +124 -0
- data/lib/logstash/shutdown_watcher.rb +100 -0
- data/lib/logstash/util.rb +203 -0
- data/lib/logstash/util/buftok.rb +139 -0
- data/lib/logstash/util/charset.rb +35 -0
- data/lib/logstash/util/decorators.rb +52 -0
- data/lib/logstash/util/defaults_printer.rb +31 -0
- data/lib/logstash/util/filetools.rb +186 -0
- data/lib/logstash/util/java_version.rb +66 -0
- data/lib/logstash/util/password.rb +25 -0
- data/lib/logstash/util/plugin_version.rb +56 -0
- data/lib/logstash/util/prctl.rb +10 -0
- data/lib/logstash/util/retryable.rb +40 -0
- data/lib/logstash/util/socket_peer.rb +7 -0
- data/lib/logstash/util/unicode_trimmer.rb +81 -0
- data/lib/logstash/util/worker_threads_default_printer.rb +29 -0
- data/lib/logstash/util/wrapped_synchronous_queue.rb +41 -0
- data/lib/logstash/version.rb +14 -0
- data/locales/en.yml +204 -0
- data/logstash-core.gemspec +58 -0
- data/spec/conditionals_spec.rb +429 -0
- data/spec/logstash/agent_spec.rb +85 -0
- data/spec/logstash/config/config_ast_spec.rb +146 -0
- data/spec/logstash/config/cpu_core_strategy_spec.rb +123 -0
- data/spec/logstash/config/defaults_spec.rb +10 -0
- data/spec/logstash/config/mixin_spec.rb +158 -0
- data/spec/logstash/environment_spec.rb +56 -0
- data/spec/logstash/filters/base_spec.rb +251 -0
- data/spec/logstash/inputs/base_spec.rb +74 -0
- data/spec/logstash/java_integration_spec.rb +304 -0
- data/spec/logstash/json_spec.rb +96 -0
- data/spec/logstash/output_delegator_spec.rb +144 -0
- data/spec/logstash/outputs/base_spec.rb +40 -0
- data/spec/logstash/patches_spec.rb +90 -0
- data/spec/logstash/pipeline_reporter_spec.rb +85 -0
- data/spec/logstash/pipeline_spec.rb +455 -0
- data/spec/logstash/plugin_spec.rb +169 -0
- data/spec/logstash/runner_spec.rb +68 -0
- data/spec/logstash/shutdown_watcher_spec.rb +113 -0
- data/spec/logstash/util/buftok_spec.rb +31 -0
- data/spec/logstash/util/charset_spec.rb +74 -0
- data/spec/logstash/util/defaults_printer_spec.rb +50 -0
- data/spec/logstash/util/java_version_spec.rb +79 -0
- data/spec/logstash/util/plugin_version_spec.rb +64 -0
- data/spec/logstash/util/unicode_trimmer_spec.rb +55 -0
- data/spec/logstash/util/worker_threads_default_printer_spec.rb +45 -0
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +28 -0
- data/spec/logstash/util_spec.rb +35 -0
- metadata +364 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/namespace"
|
3
|
+
|
4
|
+
# Global config registry.
|
5
|
+
module LogStash::Config::Registry
|
6
|
+
@registry = Hash.new
|
7
|
+
class << self
|
8
|
+
attr_accessor :registry
|
9
|
+
|
10
|
+
# TODO(sissel): Add some helper methods here.
|
11
|
+
end
|
12
|
+
end # module LogStash::Config::Registry
|
13
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/errors"
|
3
|
+
|
4
|
+
module LogStash
|
5
|
+
module Environment
|
6
|
+
extend self
|
7
|
+
|
8
|
+
LOGSTASH_CORE = ::File.expand_path(::File.join(::File.dirname(__FILE__), "..", ".."))
|
9
|
+
LOGSTASH_ENV = (ENV["LS_ENV"] || 'production').to_s.freeze
|
10
|
+
|
11
|
+
def env
|
12
|
+
LOGSTASH_ENV
|
13
|
+
end
|
14
|
+
|
15
|
+
def production?
|
16
|
+
env.downcase == "production"
|
17
|
+
end
|
18
|
+
|
19
|
+
def development?
|
20
|
+
env.downcase == "development"
|
21
|
+
end
|
22
|
+
|
23
|
+
def test?
|
24
|
+
env.downcase == "test"
|
25
|
+
end
|
26
|
+
|
27
|
+
def runtime_jars_root(dir_name, package)
|
28
|
+
::File.join(dir_name, package, "runtime-jars")
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_jars_root(dir_name, package)
|
32
|
+
::File.join(dir_name, package, "test-jars")
|
33
|
+
end
|
34
|
+
|
35
|
+
def load_runtime_jars!(dir_name="vendor", package="jar-dependencies")
|
36
|
+
load_jars!(::File.join(runtime_jars_root(dir_name, package), "*.jar"))
|
37
|
+
end
|
38
|
+
|
39
|
+
def load_test_jars!(dir_name="vendor", package="jar-dependencies")
|
40
|
+
load_jars!(::File.join(test_jars_root(dir_name, package), "*.jar"))
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_jars!(pattern)
|
44
|
+
raise(LogStash::EnvironmentError, I18n.t("logstash.environment.jruby-required")) unless LogStash::Environment.jruby?
|
45
|
+
|
46
|
+
jar_files = find_jars(pattern)
|
47
|
+
require_jars! jar_files
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_jars(pattern)
|
51
|
+
require 'java'
|
52
|
+
jar_files = Dir.glob(pattern)
|
53
|
+
raise(LogStash::EnvironmentError, I18n.t("logstash.environment.missing-jars", :pattern => pattern)) if jar_files.empty?
|
54
|
+
jar_files
|
55
|
+
end
|
56
|
+
|
57
|
+
def require_jars!(files)
|
58
|
+
files.each do |jar_file|
|
59
|
+
loaded = require jar_file
|
60
|
+
puts("Loaded #{jar_file}") if $DEBUG && loaded
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def ruby_bin
|
65
|
+
ENV["USE_RUBY"] == "1" ? "ruby" : File.join("vendor", "jruby", "bin", "jruby")
|
66
|
+
end
|
67
|
+
|
68
|
+
def jruby?
|
69
|
+
@jruby ||= !!(RUBY_PLATFORM == "java")
|
70
|
+
end
|
71
|
+
|
72
|
+
def windows?
|
73
|
+
::Gem.win_platform?
|
74
|
+
end
|
75
|
+
|
76
|
+
def locales_path(path)
|
77
|
+
return ::File.join(LOGSTASH_CORE, "locales", path)
|
78
|
+
end
|
79
|
+
|
80
|
+
def load_locale!
|
81
|
+
require "i18n"
|
82
|
+
I18n.enforce_available_locales = true
|
83
|
+
I18n.load_path << LogStash::Environment.locales_path("en.yml")
|
84
|
+
I18n.reload!
|
85
|
+
fail "No locale? This is a bug." if I18n.available_locales.empty?
|
86
|
+
end
|
87
|
+
|
88
|
+
# add path for bare/ungemified plugins lookups. the path must be the base path that will include
|
89
|
+
# the dir structure 'logstash/TYPE/NAME.rb' where TYPE is 'inputs' 'filters', 'outputs' or 'codecs'
|
90
|
+
# and NAME is the name of the plugin
|
91
|
+
# @param path [String] plugins path to add
|
92
|
+
def add_plugin_path(path)
|
93
|
+
$LOAD_PATH << path
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
require "logstash/patches"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LogStash
|
3
|
+
class Error < ::StandardError; end
|
4
|
+
class EnvironmentError < Error; end
|
5
|
+
class ConfigurationError < Error; end
|
6
|
+
class PluginLoadingError < Error; end
|
7
|
+
class ShutdownSignal < StandardError; end
|
8
|
+
class PluginNoVersionError < Error; end
|
9
|
+
|
10
|
+
class Bug < Error; end
|
11
|
+
class ThisMethodWasRemoved < Bug; end
|
12
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/namespace"
|
3
|
+
require "logstash/event"
|
4
|
+
require "logstash/logging"
|
5
|
+
require "logstash/plugin"
|
6
|
+
require "logstash/config/mixin"
|
7
|
+
require "logstash/util/decorators"
|
8
|
+
|
9
|
+
class LogStash::Filters::Base < LogStash::Plugin
|
10
|
+
include LogStash::Config::Mixin
|
11
|
+
|
12
|
+
config_name "filter"
|
13
|
+
|
14
|
+
config :type, :validate => :string, :default => "", :obsolete => "You can achieve this same behavior with the new conditionals, like: `if [type] == \"sometype\" { %PLUGIN% { ... } }`."
|
15
|
+
|
16
|
+
config :tags, :validate => :array, :default => [], :obsolete => "You can achieve similar behavior with the new conditionals, like: `if \"sometag\" in [tags] { %PLUGIN% { ... } }`"
|
17
|
+
|
18
|
+
config :exclude_tags, :validate => :array, :default => [], :obsolete => "You can achieve similar behavior with the new conditionals, like: `if (\"sometag\" not in [tags]) { %PLUGIN% { ... } }`"
|
19
|
+
|
20
|
+
# If this filter is successful, add arbitrary tags to the event.
|
21
|
+
# Tags can be dynamic and include parts of the event using the `%{field}`
|
22
|
+
# syntax.
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
# [source,ruby]
|
26
|
+
# filter {
|
27
|
+
# %PLUGIN% {
|
28
|
+
# add_tag => [ "foo_%{somefield}" ]
|
29
|
+
# }
|
30
|
+
# }
|
31
|
+
# [source,ruby]
|
32
|
+
# # You can also add multiple tags at once:
|
33
|
+
# filter {
|
34
|
+
# %PLUGIN% {
|
35
|
+
# add_tag => [ "foo_%{somefield}", "taggedy_tag"]
|
36
|
+
# }
|
37
|
+
# }
|
38
|
+
#
|
39
|
+
# If the event has field `"somefield" == "hello"` this filter, on success,
|
40
|
+
# would add a tag `foo_hello` (and the second example would of course add a `taggedy_tag` tag).
|
41
|
+
config :add_tag, :validate => :array, :default => []
|
42
|
+
|
43
|
+
# If this filter is successful, remove arbitrary tags from the event.
|
44
|
+
# Tags can be dynamic and include parts of the event using the `%{field}`
|
45
|
+
# syntax.
|
46
|
+
#
|
47
|
+
# Example:
|
48
|
+
# [source,ruby]
|
49
|
+
# filter {
|
50
|
+
# %PLUGIN% {
|
51
|
+
# remove_tag => [ "foo_%{somefield}" ]
|
52
|
+
# }
|
53
|
+
# }
|
54
|
+
# [source,ruby]
|
55
|
+
# # You can also remove multiple tags at once:
|
56
|
+
# filter {
|
57
|
+
# %PLUGIN% {
|
58
|
+
# remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"]
|
59
|
+
# }
|
60
|
+
# }
|
61
|
+
#
|
62
|
+
# If the event has field `"somefield" == "hello"` this filter, on success,
|
63
|
+
# would remove the tag `foo_hello` if it is present. The second example
|
64
|
+
# would remove a sad, unwanted tag as well.
|
65
|
+
config :remove_tag, :validate => :array, :default => []
|
66
|
+
|
67
|
+
# If this filter is successful, add any arbitrary fields to this event.
|
68
|
+
# Field names can be dynamic and include parts of the event using the `%{field}`.
|
69
|
+
#
|
70
|
+
# Example:
|
71
|
+
# [source,ruby]
|
72
|
+
# filter {
|
73
|
+
# %PLUGIN% {
|
74
|
+
# add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
|
75
|
+
# }
|
76
|
+
# }
|
77
|
+
# [source,ruby]
|
78
|
+
# # You can also add multiple fields at once:
|
79
|
+
# filter {
|
80
|
+
# %PLUGIN% {
|
81
|
+
# add_field => {
|
82
|
+
# "foo_%{somefield}" => "Hello world, from %{host}"
|
83
|
+
# "new_field" => "new_static_value"
|
84
|
+
# }
|
85
|
+
# }
|
86
|
+
# }
|
87
|
+
#
|
88
|
+
# If the event has field `"somefield" == "hello"` this filter, on success,
|
89
|
+
# would add field `foo_hello` if it is present, with the
|
90
|
+
# value above and the `%{host}` piece replaced with that value from the
|
91
|
+
# event. The second example would also add a hardcoded field.
|
92
|
+
config :add_field, :validate => :hash, :default => {}
|
93
|
+
|
94
|
+
# If this filter is successful, remove arbitrary fields from this event.
|
95
|
+
# Fields names can be dynamic and include parts of the event using the %{field}
|
96
|
+
# Example:
|
97
|
+
# [source,ruby]
|
98
|
+
# filter {
|
99
|
+
# %PLUGIN% {
|
100
|
+
# remove_field => [ "foo_%{somefield}" ]
|
101
|
+
# }
|
102
|
+
# }
|
103
|
+
# [source,ruby]
|
104
|
+
# # You can also remove multiple fields at once:
|
105
|
+
# filter {
|
106
|
+
# %PLUGIN% {
|
107
|
+
# remove_field => [ "foo_%{somefield}", "my_extraneous_field" ]
|
108
|
+
# }
|
109
|
+
# }
|
110
|
+
#
|
111
|
+
# If the event has field `"somefield" == "hello"` this filter, on success,
|
112
|
+
# would remove the field with name `foo_hello` if it is present. The second
|
113
|
+
# example would remove an additional, non-dynamic field.
|
114
|
+
config :remove_field, :validate => :array, :default => []
|
115
|
+
|
116
|
+
# Call the filter flush method at regular interval.
|
117
|
+
# Optional.
|
118
|
+
config :periodic_flush, :validate => :boolean, :default => false
|
119
|
+
|
120
|
+
public
|
121
|
+
def initialize(params)
|
122
|
+
super
|
123
|
+
config_init(@params)
|
124
|
+
@threadsafe = true
|
125
|
+
end # def initialize
|
126
|
+
|
127
|
+
public
|
128
|
+
def register
|
129
|
+
raise "#{self.class}#register must be overidden"
|
130
|
+
end # def register
|
131
|
+
|
132
|
+
public
|
133
|
+
def filter(event)
|
134
|
+
raise "#{self.class}#filter must be overidden"
|
135
|
+
end # def filter
|
136
|
+
|
137
|
+
# in 1.5.0 multi_filter is meant to be used in the generated filter function in LogStash::Config::AST::Plugin only
|
138
|
+
# and is temporary until we refactor the filter method interface to accept events list and return events list,
|
139
|
+
# just list in multi_filter see https://github.com/elastic/logstash/issues/2872.
|
140
|
+
# refactoring the filter method will mean updating all plugins which we want to avoid doing for 1.5.0.
|
141
|
+
#
|
142
|
+
# @param events [Array<LogStash::Event] list of events to filter
|
143
|
+
# @return [Array<LogStash::Event] filtered events and any new events generated by the filter
|
144
|
+
public
|
145
|
+
def multi_filter(events)
|
146
|
+
LogStash::Util.set_thread_plugin(self)
|
147
|
+
result = []
|
148
|
+
events.each do |event|
|
149
|
+
unless event.cancelled?
|
150
|
+
result << event
|
151
|
+
filter(event){|new_event| result << new_event}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
result
|
155
|
+
end
|
156
|
+
|
157
|
+
public
|
158
|
+
def execute(event, &block)
|
159
|
+
filter(event, &block)
|
160
|
+
end # def execute
|
161
|
+
|
162
|
+
public
|
163
|
+
def threadsafe?
|
164
|
+
@threadsafe
|
165
|
+
end
|
166
|
+
|
167
|
+
# a filter instance should call filter_matched from filter if the event
|
168
|
+
# matches the filter's conditions (right type, etc)
|
169
|
+
protected
|
170
|
+
def filter_matched(event)
|
171
|
+
LogStash::Util::Decorators.add_fields(@add_field,event,"filters/#{self.class.name}")
|
172
|
+
|
173
|
+
@remove_field.each do |field|
|
174
|
+
field = event.sprintf(field)
|
175
|
+
@logger.debug? and @logger.debug("filters/#{self.class.name}: removing field",
|
176
|
+
:field => field)
|
177
|
+
event.remove(field)
|
178
|
+
end
|
179
|
+
|
180
|
+
LogStash::Util::Decorators.add_tags(@add_tag,event,"filters/#{self.class.name}")
|
181
|
+
|
182
|
+
# note below that the tags array field needs to be updated then reassigned to the event.
|
183
|
+
# this is important because a construct like event["tags"].delete(tag) will not work
|
184
|
+
# in the current Java event implementation. see https://github.com/elastic/logstash/issues/4140
|
185
|
+
@remove_tag.each do |tag|
|
186
|
+
tags = event["tags"]
|
187
|
+
break if tags.nil? || tags.empty?
|
188
|
+
tag = event.sprintf(tag)
|
189
|
+
@logger.debug? and @logger.debug("filters/#{self.class.name}: removing tag", :tag => tag)
|
190
|
+
tags.delete(tag)
|
191
|
+
event["tags"] = tags
|
192
|
+
end
|
193
|
+
end # def filter_matched
|
194
|
+
|
195
|
+
protected
|
196
|
+
def filter?(event)
|
197
|
+
# TODO: noop for now, remove this once we delete this call from all plugins
|
198
|
+
true
|
199
|
+
end # def filter?
|
200
|
+
|
201
|
+
public
|
202
|
+
def close
|
203
|
+
# Nothing to do by default.
|
204
|
+
end
|
205
|
+
end # class LogStash::Filters::Base
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/namespace"
|
3
|
+
require "logstash/event"
|
4
|
+
require "logstash/plugin"
|
5
|
+
require "logstash/logging"
|
6
|
+
require "logstash/config/mixin"
|
7
|
+
require "logstash/codecs/base"
|
8
|
+
require "logstash/util/decorators"
|
9
|
+
|
10
|
+
# This is the base class for Logstash inputs.
|
11
|
+
class LogStash::Inputs::Base < LogStash::Plugin
|
12
|
+
include LogStash::Config::Mixin
|
13
|
+
config_name "input"
|
14
|
+
|
15
|
+
# Add a `type` field to all events handled by this input.
|
16
|
+
#
|
17
|
+
# Types are used mainly for filter activation.
|
18
|
+
#
|
19
|
+
# The type is stored as part of the event itself, so you can
|
20
|
+
# also use the type to search for it in Kibana.
|
21
|
+
#
|
22
|
+
# If you try to set a type on an event that already has one (for
|
23
|
+
# example when you send an event from a shipper to an indexer) then
|
24
|
+
# a new input will not override the existing type. A type set at
|
25
|
+
# the shipper stays with that event for its life even
|
26
|
+
# when sent to another Logstash server.
|
27
|
+
config :type, :validate => :string
|
28
|
+
|
29
|
+
config :debug, :validate => :boolean, :default => false, :obsolete => "This setting no longer has any effect. In past releases, it existed, but almost no plugin made use of it."
|
30
|
+
|
31
|
+
config :format, :validate => ["plain", "json", "json_event", "msgpack_event"], :obsolete => "You should use the newer 'codec' setting instead."
|
32
|
+
|
33
|
+
config :charset, :obsolete => "Use the codec setting instead. For example: input { %PLUGIN% { codec => plain { charset => \"UTF-8\" } }"
|
34
|
+
|
35
|
+
config :message_format, :validate => :string, :obsolete => "Setting is no longer valid."
|
36
|
+
|
37
|
+
# The codec used for input data. Input codecs are a convenient method for decoding your data before it enters the input, without needing a separate filter in your Logstash pipeline.
|
38
|
+
config :codec, :validate => :codec, :default => "plain"
|
39
|
+
|
40
|
+
# Add any number of arbitrary tags to your event.
|
41
|
+
#
|
42
|
+
# This can help with processing later.
|
43
|
+
config :tags, :validate => :array
|
44
|
+
|
45
|
+
# Add a field to an event
|
46
|
+
config :add_field, :validate => :hash, :default => {}
|
47
|
+
|
48
|
+
attr_accessor :params
|
49
|
+
attr_accessor :threadable
|
50
|
+
|
51
|
+
public
|
52
|
+
def initialize(params={})
|
53
|
+
super
|
54
|
+
@threadable = false
|
55
|
+
@stop_called = Concurrent::AtomicBoolean.new(false)
|
56
|
+
config_init(@params)
|
57
|
+
@tags ||= []
|
58
|
+
end # def initialize
|
59
|
+
|
60
|
+
public
|
61
|
+
def register
|
62
|
+
raise "#{self.class}#register must be overidden"
|
63
|
+
end # def register
|
64
|
+
|
65
|
+
public
|
66
|
+
def tag(newtag)
|
67
|
+
@tags << newtag
|
68
|
+
end # def tag
|
69
|
+
|
70
|
+
public
|
71
|
+
# override stop if you need to do more than do_stop to
|
72
|
+
# enforce the input plugin to return from `run`.
|
73
|
+
# e.g. a tcp plugin might need to close the tcp socket
|
74
|
+
# so blocking read operation aborts
|
75
|
+
def stop
|
76
|
+
# override if necessary
|
77
|
+
end
|
78
|
+
|
79
|
+
public
|
80
|
+
def do_stop
|
81
|
+
@logger.debug("stopping", :plugin => self)
|
82
|
+
@stop_called.make_true
|
83
|
+
stop
|
84
|
+
end
|
85
|
+
|
86
|
+
# stop? should never be overriden
|
87
|
+
public
|
88
|
+
def stop?
|
89
|
+
@stop_called.value
|
90
|
+
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
def decorate(event)
|
94
|
+
# Only set 'type' if not already set. This is backwards-compatible behavior
|
95
|
+
event["type"] = @type if @type && !event.include?("type")
|
96
|
+
|
97
|
+
LogStash::Util::Decorators.add_fields(@add_field,event,"inputs/#{self.class.name}")
|
98
|
+
LogStash::Util::Decorators.add_tags(@tags,event,"inputs/#{self.class.name}")
|
99
|
+
end
|
100
|
+
|
101
|
+
protected
|
102
|
+
def fix_streaming_codecs
|
103
|
+
require "logstash/codecs/plain"
|
104
|
+
require "logstash/codecs/line"
|
105
|
+
require "logstash/codecs/json"
|
106
|
+
require "logstash/codecs/json_lines"
|
107
|
+
case @codec
|
108
|
+
when LogStash::Codecs::Plain
|
109
|
+
@logger.info("Automatically switching from #{@codec.class.config_name} to line codec", :plugin => self.class.config_name)
|
110
|
+
@codec = LogStash::Codecs::Line.new("charset" => @codec.charset)
|
111
|
+
when LogStash::Codecs::JSON
|
112
|
+
@logger.info("Automatically switching from #{@codec.class.config_name} to json_lines codec", :plugin => self.class.config_name)
|
113
|
+
@codec = LogStash::Codecs::JSONLines.new("charset" => @codec.charset)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end # class LogStash::Inputs::Base
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/namespace"
|
3
|
+
require "logstash/inputs/base"
|
4
|
+
|
5
|
+
# This is the threadable class for logstash inputs.
|
6
|
+
# Use this class in your inputs if it can support multiple threads
|
7
|
+
class LogStash::Inputs::Threadable < LogStash::Inputs::Base
|
8
|
+
|
9
|
+
# Set this to the number of threads you want this input to spawn.
|
10
|
+
# This is the same as declaring the input multiple times
|
11
|
+
config :threads, :validate => :number, :default => 1
|
12
|
+
|
13
|
+
def initialize(params)
|
14
|
+
super
|
15
|
+
@threadable = true
|
16
|
+
end
|
17
|
+
|
18
|
+
end # class LogStash::Inputs::Threadable
|