logstash-filter-xml 3.0.1 → 4.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 +14 -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 +24 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b31248ae74ec510edd487e3fa3027fd74aa42b5
|
4
|
+
data.tar.gz: a18009abaf99dd29a9f671db974604d8496373ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7eef1c44fbfa9b7d8ea09fe1fb077c92a4ebd4dc0614a2e19eb9fd71f14410bc3369385ad78ec51d60242436dc8b5ff8e3c07f9fb34da347077590bb2951c7f2
|
7
|
+
data.tar.gz: b1231cacd1b1502de53383b8c059828925b826f206c66eb2e2d2383d39bb0c235e16e3d0c65ad9623a818d76bf5bd45a01a4f59fe29bae3d2a0728c81e93f1dc
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,24 @@
|
|
1
|
+
## 4.0.0
|
2
|
+
- breaking,config: New configuration `suppress_empty`. Default to true change default behaviour of the plugin in favor of avoiding mapping conflicts when reaching elasticsearch
|
3
|
+
- config: New configuration `force_content`. By default the filter expands attributes differently from content in xml elements.
|
4
|
+
This option allows you to force text content and attributes to always parse to a hash value.
|
5
|
+
- config: Ensure that `target` is set when storing xml content in the event (`store_xml => true`)
|
6
|
+
|
1
7
|
## 3.0.1
|
2
8
|
- Republish all the gems under jruby.
|
9
|
+
|
3
10
|
## 3.0.0
|
4
11
|
- Update the plugin to the version 2.0 of the plugin api, this change is required for Logstash 5.0 compatibility. See https://github.com/elastic/logstash/issues/5141
|
5
|
-
|
12
|
+
|
13
|
+
## 2.1.4
|
6
14
|
- Added setting to disable forcing single values to be added in arrays. Ref: https://github.com/logstash-plugins/logstash-filter-xml/pull/28.
|
7
|
-
|
15
|
+
|
16
|
+
## 2.1.3
|
8
17
|
- Depend on logstash-core-plugin-api instead of logstash-core, removing the need to mass update plugins on major releases of logstash
|
9
|
-
|
18
|
+
|
19
|
+
## 2.1.2
|
10
20
|
- New dependency requirements for logstash-core for the 5.0 release
|
21
|
+
|
11
22
|
## 2.1.1
|
12
23
|
- Refactored field references, code cleanups
|
13
24
|
|
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, output nothing if the element is empty.
|
96
|
+
# If set to `false`, empty element will result in an empty hash object.
|
97
|
+
config :suppress_empty, :validate => :boolean, :default => true
|
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)
|
@@ -159,7 +177,9 @@ class LogStash::Filters::Xml < LogStash::Filters::Base
|
|
159
177
|
|
160
178
|
if @store_xml
|
161
179
|
begin
|
162
|
-
|
180
|
+
xml_options = {"ForceArray" => @force_array, "ForceContent" => @force_content}
|
181
|
+
xml_options["SuppressEmpty"] = true if @suppress_empty
|
182
|
+
event.set(@target, XmlSimple.xml_in(value, xml_options))
|
163
183
|
matched = true
|
164
184
|
rescue => e
|
165
185
|
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 = '
|
4
|
+
s.version = '4.0.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
|
@@ -305,4 +309,92 @@ describe LogStash::Filters::Xml do
|
|
305
309
|
insist { subject.get("parseddata") } == { "bar" => "Content" }
|
306
310
|
end
|
307
311
|
end
|
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.get("tags") }.nil?
|
327
|
+
insist { subject.get("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.get("tags") }.nil?
|
344
|
+
insist { subject.get("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.get("tags") }.nil?
|
364
|
+
insist { subject.get("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.get("tags") }.nil?
|
381
|
+
insist { subject.get("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
|
308
400
|
end
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.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-05-
|
11
|
+
date: 2016-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: logstash-core-plugin-api
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
14
20
|
requirement: !ruby/object:Gem::Requirement
|
15
21
|
requirements:
|
16
|
-
- -
|
22
|
+
- - ~>
|
17
23
|
- !ruby/object:Gem::Version
|
18
24
|
version: '2.0'
|
19
|
-
name: logstash-core-plugin-api
|
20
25
|
prerelease: false
|
21
26
|
type: :runtime
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
22
29
|
version_requirements: !ruby/object:Gem::Requirement
|
23
30
|
requirements:
|
24
|
-
- -
|
31
|
+
- - '>='
|
25
32
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
-
- !ruby/object:Gem::Dependency
|
33
|
+
version: '0'
|
28
34
|
requirement: !ruby/object:Gem::Requirement
|
29
35
|
requirements:
|
30
|
-
- -
|
36
|
+
- - '>='
|
31
37
|
- !ruby/object:Gem::Version
|
32
38
|
version: '0'
|
33
|
-
name: nokogiri
|
34
39
|
prerelease: false
|
35
40
|
type: :runtime
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: xml-simple
|
36
43
|
version_requirements: !ruby/object:Gem::Requirement
|
37
44
|
requirements:
|
38
|
-
- -
|
45
|
+
- - '>='
|
39
46
|
- !ruby/object:Gem::Version
|
40
47
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
48
|
requirement: !ruby/object:Gem::Requirement
|
43
49
|
requirements:
|
44
|
-
- -
|
50
|
+
- - '>='
|
45
51
|
- !ruby/object:Gem::Version
|
46
52
|
version: '0'
|
47
|
-
name: xml-simple
|
48
53
|
prerelease: false
|
49
54
|
type: :runtime
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: logstash-devutils
|
50
57
|
version_requirements: !ruby/object:Gem::Requirement
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
62
|
requirement: !ruby/object:Gem::Requirement
|
57
63
|
requirements:
|
58
|
-
- -
|
64
|
+
- - '>='
|
59
65
|
- !ruby/object:Gem::Version
|
60
66
|
version: '0'
|
61
|
-
name: logstash-devutils
|
62
67
|
prerelease: false
|
63
68
|
type: :development
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
69
|
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
|
70
70
|
email: info@elastic.co
|
71
71
|
executables: []
|
@@ -93,12 +93,12 @@ require_paths:
|
|
93
93
|
- lib
|
94
94
|
required_ruby_version: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
|
-
- -
|
96
|
+
- - '>='
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
requirements: []
|