logstash-filter-xml 2.1.4 → 2.2.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 +13 -3
- data/lib/logstash/filters/xml.rb +23 -3
- data/logstash-filter-xml.gemspec +1 -1
- data/spec/filters/xml_spec.rb +92 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c54641de27d0a2d3d1521cf95ca13053cf79fdf
|
4
|
+
data.tar.gz: 45fa43b4e3e0e8d55de05be69ab68c8b2e63b8e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e43cd5a04b877149db47c036303f1a74cfef0e6f3033c5994409f2d98edd957dcd9dcefff64e679bee7f134aa1e737c37c5b39adc21143223807e78f2580cec0
|
7
|
+
data.tar.gz: a54963d0704933285befe3b70ef4ec35fd921808cea3c631d5900cb0a6934fcc8c48e863f3d722eeccff1d82027289a4b837dd3054d0061698bbb25d1ed1af0c
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
-
|
1
|
+
## 2.2.0
|
2
|
+
- config: New configuration `suppress_empty`. By default the filter creates empty hash from empty xml elements (`suppress_empty => false`).
|
3
|
+
This can now be configured, `supress_empty => true` will not create event fields from empty xml elements.
|
4
|
+
- config: New configuration `force_content`. By default the filter expands attributes differently from content in xml elements.
|
5
|
+
This option allows you to force text content and attributes to always parse to a hash value.
|
6
|
+
- config: Ensure that `target` is set when storing xml content in the event (`store_xml => true`)
|
7
|
+
|
8
|
+
## 2.1.4
|
2
9
|
- Added setting to disable forcing single values to be added in arrays. Ref: https://github.com/logstash-plugins/logstash-filter-xml/pull/28.
|
3
|
-
|
10
|
+
|
11
|
+
## 2.1.3
|
4
12
|
- Depend on logstash-core-plugin-api instead of logstash-core, removing the need to mass update plugins on major releases of logstash
|
5
|
-
|
13
|
+
|
14
|
+
## 2.1.2
|
6
15
|
- New dependency requirements for logstash-core for the 5.0 release
|
16
|
+
|
7
17
|
## 2.1.1
|
8
18
|
- Refactored field references, code cleanups
|
9
19
|
|
data/lib/logstash/filters/xml.rb
CHANGED
@@ -51,10 +51,10 @@ class LogStash::Filters::Xml < LogStash::Filters::Base
|
|
51
51
|
# destination field as an array. As such, multiple matches across
|
52
52
|
# multiple source fields will produce duplicate entries in the field.
|
53
53
|
#
|
54
|
-
# More on XPath: http://www.w3schools.com/
|
54
|
+
# More on XPath: http://www.w3schools.com/xml/xml_xpath.asp
|
55
55
|
#
|
56
56
|
# The XPath functions are particularly powerful:
|
57
|
-
# http://www.w3schools.com/
|
57
|
+
# http://www.w3schools.com/xsl/xsl_functions.asp
|
58
58
|
#
|
59
59
|
config :xpath, :validate => :hash, :default => {}
|
60
60
|
|
@@ -66,6 +66,11 @@ class LogStash::Filters::Xml < LogStash::Filters::Base
|
|
66
66
|
# false will prevent storing single elements in arrays.
|
67
67
|
config :force_array, :validate => :boolean, :default => true
|
68
68
|
|
69
|
+
# By default the filter will expand attributes differently from content inside
|
70
|
+
# of tags. This option allows you to force text content and attributes to always
|
71
|
+
# parse to a hash value.
|
72
|
+
config :force_content, :validate => :boolean, :default => false
|
73
|
+
|
69
74
|
# By default only namespaces declarations on the root element are considered.
|
70
75
|
# This allows to configure all namespace declarations to parse the XML document.
|
71
76
|
#
|
@@ -87,11 +92,24 @@ class LogStash::Filters::Xml < LogStash::Filters::Base
|
|
87
92
|
# Of course, if the document had nodes with the same names but different namespaces, they will now be ambiguous.
|
88
93
|
config :remove_namespaces, :validate => :boolean, :default => false
|
89
94
|
|
95
|
+
# By default, empty element will result in an empty hash object
|
96
|
+
# If set to `true`, output nothing if the element is empty..
|
97
|
+
config :suppress_empty, :validate => :boolean, :default => false
|
98
|
+
|
90
99
|
XMLPARSEFAILURE_TAG = "_xmlparsefailure"
|
91
100
|
|
92
101
|
def register
|
93
102
|
require "nokogiri"
|
94
103
|
require "xmlsimple"
|
104
|
+
|
105
|
+
if @store_xml && (!@target || @target.empty?)
|
106
|
+
raise LogStash::ConfigurationError, I18n.t(
|
107
|
+
"logstash.agent.configuration.invalid_plugin_register",
|
108
|
+
:plugin => "filter",
|
109
|
+
:type => "xml",
|
110
|
+
:error => "When the 'store_xml' configuration option is true, 'target' must also be set"
|
111
|
+
)
|
112
|
+
end
|
95
113
|
end
|
96
114
|
|
97
115
|
def filter(event)
|
@@ -163,7 +181,9 @@ class LogStash::Filters::Xml < LogStash::Filters::Base
|
|
163
181
|
|
164
182
|
if @store_xml
|
165
183
|
begin
|
166
|
-
|
184
|
+
xml_options = {"ForceArray" => @force_array, "ForceContent" => @force_content}
|
185
|
+
xml_options["SuppressEmpty"] = true if @suppress_empty
|
186
|
+
event[@target] = XmlSimple.xml_in(value, xml_options)
|
167
187
|
matched = true
|
168
188
|
rescue => e
|
169
189
|
event.tag(XMLPARSEFAILURE_TAG)
|
data/logstash-filter-xml.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-filter-xml'
|
4
|
-
s.version = '2.
|
4
|
+
s.version = '2.2.0'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Takes a field that contains XML and expands it into an actual datastructure."
|
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/logstash-plugin install gemname. This gem is not a stand-alone program"
|
data/spec/filters/xml_spec.rb
CHANGED
@@ -209,6 +209,7 @@ describe LogStash::Filters::Xml do
|
|
209
209
|
source => "xmldata"
|
210
210
|
xpath => [ "/foo/h:div", "xpath_field" ]
|
211
211
|
remove_namespaces => false
|
212
|
+
store_xml => false
|
212
213
|
}
|
213
214
|
}
|
214
215
|
CONFIG
|
@@ -227,6 +228,7 @@ describe LogStash::Filters::Xml do
|
|
227
228
|
xpath => [ "/foo/h:div", "xpath_field" ]
|
228
229
|
namespaces => {"h" => "http://www.w3.org/TR/html4/"}
|
229
230
|
remove_namespaces => false
|
231
|
+
store_xml => false
|
230
232
|
}
|
231
233
|
}
|
232
234
|
CONFIG
|
@@ -245,6 +247,7 @@ describe LogStash::Filters::Xml do
|
|
245
247
|
xpath => [ "/foo/h:div", "xpath_field" ]
|
246
248
|
namespaces => {"h" => "http://www.w3.org/TR/html4/"}
|
247
249
|
remove_namespaces => false
|
250
|
+
store_xml => false
|
248
251
|
}
|
249
252
|
}
|
250
253
|
CONFIG
|
@@ -262,6 +265,7 @@ describe LogStash::Filters::Xml do
|
|
262
265
|
source => "xmldata"
|
263
266
|
xpath => [ "/foo/div", "xpath_field" ]
|
264
267
|
remove_namespaces => true
|
268
|
+
store_xml => false
|
265
269
|
}
|
266
270
|
}
|
267
271
|
CONFIG
|
@@ -306,4 +310,92 @@ describe LogStash::Filters::Xml do
|
|
306
310
|
end
|
307
311
|
end
|
308
312
|
|
313
|
+
context "Using suppress_empty option" do
|
314
|
+
describe "suppress_empty => false" do
|
315
|
+
config <<-CONFIG
|
316
|
+
filter {
|
317
|
+
xml {
|
318
|
+
source => "xmldata"
|
319
|
+
target => "data"
|
320
|
+
suppress_empty => false
|
321
|
+
}
|
322
|
+
}
|
323
|
+
CONFIG
|
324
|
+
|
325
|
+
sample("xmldata" => '<foo><key>value1</key><key></key></foo>') do
|
326
|
+
insist { subject["tags"] }.nil?
|
327
|
+
insist { subject["data"] } == {"key" => ["value1", {}]}
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
describe "suppress_empty => true" do
|
332
|
+
config <<-CONFIG
|
333
|
+
filter {
|
334
|
+
xml {
|
335
|
+
source => "xmldata"
|
336
|
+
target => "data"
|
337
|
+
suppress_empty => true
|
338
|
+
}
|
339
|
+
}
|
340
|
+
CONFIG
|
341
|
+
|
342
|
+
sample("xmldata" => '<foo><key>value1</key><key></key></foo>') do
|
343
|
+
insist { subject["tags"] }.nil?
|
344
|
+
insist { subject["data"] } == {"key" => ["value1"]}
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
context "Using force content option" do
|
350
|
+
describe "force_content => false" do
|
351
|
+
config <<-CONFIG
|
352
|
+
filter {
|
353
|
+
xml {
|
354
|
+
source => "xmldata"
|
355
|
+
target => "data"
|
356
|
+
force_array => false
|
357
|
+
force_content => false
|
358
|
+
}
|
359
|
+
}
|
360
|
+
CONFIG
|
361
|
+
|
362
|
+
sample("xmldata" => '<opt><x>text1</x><y a="2">text2</y></opt>') do
|
363
|
+
insist { subject["tags"] }.nil?
|
364
|
+
insist { subject["data"] } == { 'x' => 'text1', 'y' => { 'a' => '2', 'content' => 'text2' } }
|
365
|
+
end
|
366
|
+
end
|
367
|
+
describe "force_content => true" do
|
368
|
+
config <<-CONFIG
|
369
|
+
filter {
|
370
|
+
xml {
|
371
|
+
source => "xmldata"
|
372
|
+
target => "data"
|
373
|
+
force_array => false
|
374
|
+
force_content => true
|
375
|
+
}
|
376
|
+
}
|
377
|
+
CONFIG
|
378
|
+
|
379
|
+
sample("xmldata" => '<opt><x>text1</x><y a="2">text2</y></opt>') do
|
380
|
+
insist { subject["tags"] }.nil?
|
381
|
+
insist { subject["data"] } == { 'x' => { 'content' => 'text1' }, 'y' => { 'a' => '2', 'content' => 'text2' } }
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
describe "plugin registration" do
|
387
|
+
config <<-CONFIG
|
388
|
+
filter {
|
389
|
+
xml {
|
390
|
+
xmldata => "message"
|
391
|
+
store_xml => true
|
392
|
+
}
|
393
|
+
}
|
394
|
+
CONFIG
|
395
|
+
|
396
|
+
sample("xmldata" => "<foo>random message</foo>") do
|
397
|
+
insist { subject }.raises(LogStash::ConfigurationError)
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
309
401
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-core-plugin-api
|