Module: LogStash
- Defined in:
- lib/logstash/filters/dissect.rb
Overview
The Dissect filter is a kind of split operation. Unlike a regular split operation where one delimiter is applied to the whole string, this operation applies a set of delimiters # to a string value. + Dissect does not use regular expressions and is very fast. + However, if the structure of your text varies from line to line then Grok is more suitable. + There is a hybrid case where Dissect can be used to de-structure the section of the line that is reliably repeated and then Grok can be used on the remaining field values with # more regex predictability and less overall work to do. +
A set of fields and delimiters is called a dissection.
The dissection is described using a set of ‘%{}` sections: .… %a - %b - %c .…
A field is the text from ‘%` to `}` inclusive.
A delimiter is the text between ‘}` and `%` characters.
- NOTE
-
delimiters can’t contain these ‘}characters.
The config might look like this: .…
filter { dissect { mapping => { "message" => "%{ts %+ts %+ts %src %{} %prog[%pid]: %msg" } } }
.… When dissecting a string from left to right, text is captured upto the first delimiter - this captured text is stored in the first field. This is repeated for each field/# delimiter pair thereafter until the last delimiter is reached, then *the remaining text is stored in the last field*. +
*The Key:* + The key is the text between the ‘%{` and `}`, exclusive of the ?, , & prefixes and the ordinal suffix. `%{?aaa}` - key is `aaa` + `%{+bbb/3}` - key is `bbb` + `%{&ccc}` - key is `ccc` +
*Normal field notation:* + The found value is added to the Event using the key. + ‘%{some_field}` - a normal field has no prefix or suffix
*Skip field notation:* + The found value is stored internally but not added to the Event. + The key, if supplied, is prefixed with a ‘?`.
‘%{}` is an empty skip field.
‘%{?foo}` is a named skip field.
*Append field notation:* + The value is appended to another value or stored if its the first field seen. + The key is prefixed with a ‘+`. + The final value is stored in the Event using the key. +
- NOTE
-
The delimiter found before the field is appended with the value. + If no delimiter is found before the field, a single space character is used.
‘%{+some_field}` is an append field. + `%{+some_field/2}` is an append field with an order modifier.
An order modifier, ‘/digits`, allows one to reorder the append sequence. + e.g. for a text of `1 2 3 go`, this `%{+a/2} %{+a/1} %{+a/4} %{+a/3}` will build a key/value of `a => 2 1 go 3` + Append fields without an order modifier will append in declared order. + e.g. for a text of `1 2 3 go`, this `%{a} %{b} %{+a}` will build two key/values of `a => 1 3 go, b => 2` +
*Indirect field notation:* + The found value is added to the Event using the found value of another field as the key. + The key is prefixed with a ‘&`. + `%{&some_field}` - an indirect field where the key is indirectly sourced from the value of `some_field`. + e.g. for a text of `error: some_error, some_description`, this `error: %{?err}, %{&err}` will build a key/value of `some_error => some_description`.
- NOTE
-
for append and indirect field the key can refer to a field that already exists in the event before dissection.
- NOTE
-
use a Skip field if you do not want the indirection key/value stored.
e.g. for a text of ‘google: 77.98`, this `%{?a}: %{&a}` will build a key/value of `google => 77.98`.
- NOTE
-
append and indirect cannot be combined and will fail validation. + ‘%{+&something}` - will add a value to the `&something` key, probably not the intended outcome. + `%{&+something}` will add a value to the `+something` key, again probably unintended. +
*Delimiter repetition:* + In the source text if a field has variable width padded with delimiters, the padding will be ignored. + e.g. for texts of: .… 00000043 ViewReceiver I 000000b3 Peer I .… with a dissection of ‘%{a} %{b} %{c}`; the padding is ignored, `event.get() -> “I”`
- NOTE
-
You probably want to use this filter inside an ‘if` block. + This ensures that the event contains a field value with a suitable structure for the dissection.
For example… .… filter {
if [type] == "syslog" or "syslog" in [tags] { dissect { mapping => { "message" => "%{ts} %{+ts} %{+ts} %{src} %{} %{prog}[%{pid}]: %{msg}" } } }
} .…
Defined Under Namespace
Modules: Filters