[TOC]
# logstash 多行合并 (multiline)

logstash处理多行日志数据,可以在input插件中添加codec => multiline,如下file插件:
```
input {
file {
path => "/home/elastic/docview.log"
start_position => "beginning"
sincedb_path => "/dev/null" #从头读
codec => multiline {
pattern => "^%{YEAR}%{MONTHNUM}%{MONTHDAY}[ ]%{TIME}"
negate => true
what => "previous"
}
}
}
```
# file插件,导致日志数据最后一行无法读取
如果是使用file插件,不仅会导致日志数据最后一行无法读取,还会丢失最后一行日志的所有字段。
使用logstash-filter-multiline插件可以解决此问题
logstash5.0 默认没有安装此插件,需要自行安装
```
./bin/logstash-plugin install logstash-filter-multiline
```
如果安装失败或者需要离线安装,可以到已安装的机器上复制gem文件
目录 ./logstash/vendor/bundle/jruby/1.9/cache/logstash-filter-multiline-3.0.2.gem
```
./bin/logstash-plugin install ./vendor/bundle/jruby/1.9/cache/logstash-filter-multiline-3.0.2.gem
```
logstash-filter-multiline插件使用示例
```
filter{
multiline {
pattern => "^%{YEAR}%{MONTHNUM}%{MONTHDAY}[ ]%{TIME}"
negate => true
what => "previous"
}
}
```
# beats输入插件,使用logstash-filter-multiline插件仍然会导致日志数据最后一行无法读取
但是针对beats输入插件,使用logstash-filter-multiline插件仍然会导致日志数据最后一行无法读取,解决方案是在filebeat采集时进行多行合并。filebeat配置如下:
```
multiline.pattern: '^\d{8} \d{2}:\d{2}:\d{2}.\d{3}'
multiline.negate: true
multiline.match: after
```
注:filebeat配置项multiline.match,after表示匹配项放在上一行后面,before表示匹配项放在下一行前面,意思和logstash相反。