The multiline filter is designed to combine messages that span lines into a single event that can be easily processed with other logstash filters. Systems that throw large exceptions (e.g. Java) are the standard use-case for this filter.
At the most basic, you need to provide three pieces of information to the filter:
- ‘pattern’: the regular expression that signals the start of a new event.
- ‘what’: the action to take with a line that does or doesn’t match the pattern.
- ‘negate’: how the does/doesn’t for ‘what’ is decided.
When ‘negate’ is set to true, read it as “when my PATTERN doesn’t match, do WHAT”; when false, read it as “when my PATTERN does match, do WHAT”.
In this example, ‘negate’ is true, so we read it as “when my timestamp pattern doesn’t match, keep the line with the previous entry”:
filter {
multiline {
negate => 'true'
pattern => "^%{TIMESTAMP_ISO8601} "
what => 'previous'
}
}
This filter should be used first, so that other filters will see the single event.
Until a new line matches the pattern, logstash is expecting more lines to join, so it won’t release the combined event. There is an enable_flush option, but it should not be used in production. In logstash version 1.5, the flush will be “production ready”.
When using multiline, you cannot use multiple filter workers, as each worker would be reading a different line. If you attempt this configuration, logstash will not start.
If your application writes log entries in a way where they can overlap with each other, the basic filter can’t help you. However, if your system prints a common string in each message (a UUID, etc), you can use that to combine messages. See the ‘stream_identity’ option.
You should also consider using the multiline{} codec, so that messages are combined in the input{} phase. Note that the codec doesn’t offer the ‘stream_identity’ option.