logstash匹配多行日志
在工作中,遇到一个问题就是日志的处理,首选的方案就是ELFK(filebeat+logstash+es+kibana)
因为之前使用过logstash采集日志的时候,非常的消耗系统的资源,所以这里我选择了更加轻量级的日志采集器fiebeat,
我这里是使用filebeat采集日志,然后把日志传给logstash 进行匹配解析。然后存储到es里面,最后使用kibana进行页面上的展示
我这里的环境是这样的
filebeat-5.3.0-linux-x86_64.tar.gz
logstash-2.3.1.tar.gz
elasticsearch-1.7.3.tar.gz
kibana-4.1.2-linux-x64.tar.gz
我这里filebeat的配置是这样的
这里我的日志接收端logstash的配置是这样的
这里我在使用logstash的插件multiline插件的时候总是报错是multiline 插件的报错。我的logstash的版本是2.0.0
然后我给他换成2.3.1
./logstash-plugin install logstash-filter-multiline
装上插件
input { beats { type => beats port => 5077 } } filter { multiline { pattern => ".*##.*" negate => true what => "previous" } }
不要在logstash的filter plugin中配置multiline(文章转自:http://niubidian.top/blog/show/27/)
如果在filter plugin中配multiline的话,logstash的workers会强制设置为1(即使你设置为其他值也没用)。这样会导致logstash处理效率下降。
解决办法就是将多行匹配配置到input plugin中。可以这样
input { beats { port => "5191" codec => multiline { patterns_dir => ["/data/package/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.2/patterns"] pattern => ".*#ELK#.*" what => "previous" negate => true } } }
output { if [type] == 'test-front' { elasticsearch { hosts => ["10.19.148.59:9200"] index => "test-front-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } } }
匹配含有字符串##的行,如果没有这个字符串的行,那肯定是属于前一行的。
对 multiline 插件来说,有三个设置比较重要:negate、pattern 和 what。
what
必须设置
可以为 previous 或 next
没有默认值
如果正则表达式匹配了,那么该事件是属于下一个或是前一个事件?
pattern
必须设置
类型为 string
没有默认值
要匹配的正则表达式。
negate
类型是 boolean
默认为 false
否定正则表达式(如果没有匹配的话)。
参考链接:http://blog.csdn.net/wyqlxy/article/details/52622867
我的日志的格式是这样的
这里我们可以看一下logback.xml里的配置
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %le %lo [%thread]: [appid => -] ## '%msg' '%ex'\n</pattern>
</encoder>
2017-04-05 17:50:22.765 DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor[qtp1213415012-17]: [appid => -] ## 'Written [1] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@656e9929]' 'java.lang.RuntimeException: For debugging purposes only (not an error) at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:367) at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:389) at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.getSession(SessionRepositoryFilter.java:214) at com.kongzhong.interceptor.SSOLoginInterceptor.preHandle(SSOLoginInterceptor.java:91) at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:958) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
要是上面想写正则的话是这样的
%{TIMESTAMP_ISO8601:date} %{WORD:Level} %{DATA:CLASS} \[%{DATA:Thread}\]: %{SYSLOG5424SD:appid} ## \'%{DATA:message}\' (\'\'|%{QUOTEDSTRING:Exception})
参考文档链接:
http://blog.csdn.net/wyqlxy/article/details/52622867
https://discuss.elastic.co/t/filebeat-and-multiline/38499/5
https://www.jamf.com/jamf-nation/discussions/11351/logstash-filter
ELK的文章 http://blog.oldboyedu.com/elk/ http://www.tuicool.com/articles/YRZzQzZ http://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html http://jayveehe.github.io/2017/02/01/elk-stack/ http://shildon.leanote.com/post/%E6%90%AD%E5%BB%BAELK%E7%AC%94%E8%AE%B0 filebeats 的文章 http://www.nibayuan.com/articles/2016/02/24/elk-filebeat.html 这里我们要给logstash 的beat的插件给装上 在使用filebeat的时候数据总是穿不过去,我也装上logstash-input-beats的插件了 但是就是不行,然后我按照网上的方法把这个插件给卸载了 bin/plugin uninstall logstash-input-beats cd /data/tools wget https://rubygems.org/downloads/logstash-input-beats-0.9.3.gem ./bin/plugin install /data/tools/logstash-input-beats-0.9.3.gem 然后我们再启动logstash 和filebeat就好了 ./filebeat -e -c filebeat.yml filebeat配置多个log https://www.zybuluo.com/muyanfeixiang/note/608470 filebeat 配置文件的解释 http://www.cnblogs.com/zlslch/p/6622079.html logstash 的配置文件的格式 http://www.cnblogs.com/smail-bao/p/5695656.html