logstash上篇已经说过了是用于在elk系统中是充当一个管道的作用,用来将filebeat中的数据传输到elasticsearch中。

其实logstash还可以做一件事,设置elasticsearch的index、targer、field(索引、目标、字段),你可以做一个简单的理解索引是数据库,目标是表,字段就是字段咯,那么设置这些有什么用呢?

1.搜索日志的时候可以用了做查询条;2.可以用kibana做分析图表。

搜索日志的时候可以用了做查询条

可以用kibana做分析图表

修改配置logstash的文件

filter {
         if [message] =~ "Hibernate:*" {
                 drop { }
         }
         if "response" in [message] {
                 grok {
                         match => {"message" => "%{TIMESTAMP_ISO8601}  %{LOGLEVEL} %{NUMBER} --- \[%{DATA}\] %{GREEDYDATA}: client\[%{DATA:device}\] response: {PATH=%{UNIXPATH:uri}, HTTP_METHOD=%{WORD}}, use time: %{NUMBER:usetime_0:int}ms"}
                 }
         }
         if ":url:http:" in [message] {
                 grok {
                         match => {"message" => "%{TIMESTAMP_ISO8601}  %{LOGLEVEL} %{NUMBER} --- \[%{DATA}\] %{GREEDYDATA}: 资金存管接口-\[%{DATA:requestid}\]-响应:url:http://%{URIHOST:urihost}%{URIPATH:uripath} , result:%{GREEDYDATA:param}, 耗时:%{NUMBER:usetime:int}ms"
                         }
                 }
         }
         json {
                 source => "param"
                 target => "param_json"
         }
         if [param] {
                 ruby {
                         code => "
                         kv=event.get('param_json')
                         kv.each do |k,v|
                                 if k != 'data'
                                         event.set(k,v)
                                 end
                         end"
                         remove_field => ["param_json","param"]
                         remove_tag => ["param_json","param"]
                 }
         }
 }

filter中有很多插件,也有自己的语法

logstash中有很多默认的field,message是日志文件的内容

grok是用来设置日志格式来提取field,利用%{XXXX:a}这种语法

“XXXX”是一套封装好的匹配格式参考:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

”a“就是自定义的字段名称(注意不要与默认的字段名称重复),还可以在”a“后加上”:int“这个是设置字段格式(默认的是string),官网上说只支持int和float两种。

kibana中有一个功能叫Grok Debugger可以很方便的调试

grok语法调试工具

这一天有个日志文件的分享需求,解析日志文件中json中的某个公参字段,其他的字段就很随意了,没有任何价值了

json配置source设置需要解析的字段名称,target是别名

ruby是一种一直高级语言,作为logstash插件可以更加灵活的过滤操作日志文件

ruby {
code => "
kv=event.get('param_json')
kv.each do |k,v|
if k != 'data'
event.set(k,v)
end
end"
remove_field => ["param_json","param"]
remove_tag => ["param_json","param"]
}

event是logstash中的内置对象,set(“字段名称”,"值"),其中的值一般情况都是另一个字段的别名,不用担心会出现两个不同名字的相同内容的字段,使用每个插件中都有的remove_field就可以去掉。

作为高级语言if for 语句是必不可少的,因此你可以灵活的个性的操作你所需要的字段。


总结

在从没听过elk到能够熟练的使用kibana制作统计图表,我花了将近一个月时间(天资愚钝+工作繁忙),其中走了不少的弯路,作为一名开发对linux系统的不熟悉成了最大的瓶颈,期间不止一次的想放弃,最后还是兴趣和好奇驱使着我克服了这些。

其实elk中还有很多其他公司开发的一些好用的插件可以使用(开源的优势),比如elasticAlert可以实时监控并发送邮件进行报警,后来elastic又出来了一种插件watcher,不过得安装listen