今天继续给大家介绍Linux运维相关知识,本文主要内容是Logstash的多行日志收集。
一、Logstash日志收集新问题
在前文ELK详解(八)——Logstash收集系统日志实战、ELK详解(九)——Logstash多日志收集实战和ELK详解(十)——Logstash收集Tomcat日志实战几文中,我们使用Logstash进行了日志收集实战,已经可以通过Logstash收集指定的日志,并且将其输出到我们Elasticsearch集群上,并最终在Kibana上显示。
今天,我们要讨论一些特殊日志的Logstash收集方式。以ELK日志为例,其中一个日志片段如下所示:
可以看出,在上图中红圈部分,是一些JAVA(事实上,ELK就是依赖于JAVA环境而,所以才有JAVA的报错)的报错信息。这些信息分了多行列出,但是这些信息却在本质上算一条“日志信息”。因此,我们希望Logstash在日志收集的时候,把这些信息看做一条日志信息来进行收集。事实上,这种日志格式是非常常见的,几乎所有基于JAVA开发的项目,都面临这样的问题。
为解决上面的问题,我们需要重新指定划分日志的依据,观察上面的日志格式,我们可以发现,每一条日志,基本上都是以换行符加上左中括号开头的,基于这种规则,我们就可以正确的划分日志,解决上述问题。而这种划分原理的实现,依托于Logstash中codec模块的multiline插件。
二、Logstash配置详解
首先,我们先来写一下Logstash的配置文件,内容如下:
input{
file{
path=>"/var/log/elasticsearch/my-elk.log"
type=>"elk"
start_position=>"beginning"
stat_interval=>"5"
codec=>multiline{
pattern=>"^\["
negate=>"true"
what=>"previous"
}
}
}
output{
elasticsearch{
hosts=>["192.168.136.101:9200"]
index=>"elk-log-%{+YYYY.MM.dd}"
}
}
在上述配置中,input输入使用了codec的multiline插件,里面有3个参数,pattern参数指定了匹配的模式,“^”表示开头,“\”表示转义,“[”为左中括号的意思;negate表示匹配成功的操作,相反,若想设置为匹配失败,则可以将negate设置为false;what为previous表示与之前的内容进行合并,如果想要设置为和之后的内容合并,可以将该值设置为next。
在完成上述配置后,我们执行命令:
logstash -f /etc/elasticsearch/conf.d/elk-log.conf
用于执行日志收集命令。
三、效果展示
最后,我们来检验一下刚才配置的结果。
执行完日志收集后,我们来到Elasticsearch上,查看发现有指定的日志,结果如下所示:
接下来,我们前往Kibana上查看日志信息,发现包含JAVA报错(告警)信息的日志已经称为了单个日志,不再分裂,结果如下:
由此可见,我们的Logstash多行日志收集成功!
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200