最近在做项目的过程中,使用filebeat代替logstash做日志收集,用elasticsearch的ingestNode做字段的过滤相关。遇到了不少的坑,记录一下。
首先关于ingestNode代替logstash做字段的提取,请看另一篇博文《filebeat+elasticsearch从massage中提取字段》,地址:http://blog.csdn.net/spring_ming/article/details/62232331。
在filebeat提取字段时,需要创建一个pipeline管道,可以在kibana中的devtool里建立新的管道,格式为:
PUT _ingest/pipeline/test-pipeline
{
"description" : "test-pipeline",
"processors" : []
}
问题1:不只一种规则的字段提取
在pipeline中提取massage中的字段,例如以下日志格式的提取:
日志示例:
55.3.244.1 GET /index.html 15824 0.043
提取管道格式:
{
"description" : "test-pipeline",
"processors" : [
{
"grok" :{
"field" : "message",
"patterns" :["%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"
]
}
}
]
}
当日志文件中不只有一个格式时,elasticsearch就会报错,日志解析就会失败,当我们有多个格式日志时,比如:
55.3.244.1 GET /index.html 15824 0.043
1.201.11.21 POST /index.html 2222 "aaa"
提取管道只需在后面加对应的格式即可:
{
"description" : "test-pipeline",
"processors" : [
{
"grok" :{
"field" : "message",
"patterns" :["%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}",
"%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{QUOTEDSTRING:desc}"
]
}
}
]
}
问题2:在ingestNode中如何使用条件分支
在项目过程中,需要将日志信息中的数字转化为应显示的汉字信息,这就要用到if…条件进行判断,在ingestNode中没有找到对应的管道配置,最好找到了script pipeline,具体配置如下:
{
"description" : "test-pipeline",
"processors" : [
{ "script" : {
"lang" : "painless",
"inline" : "if(ctx.id == \"1\"){ctx.fruit = params.param_1}if(ctx.id == \"2\"){ctx.fruit = params.param_2}if(ctx.id == \"3\"){ctx.fruit = params.param_3}if(ctx.id == \"4\"){ctx.fruit = params.param_4},
"params" : {
"param_1" :"苹果",
"param_2" :"香蕉",
"param_3" :"西瓜",
"param_4" :"葡萄"
}
}
}
]
}
其中ctx.id是从日志信息中拿出id字段,如果id字段等于1,就添加一个字段fruit值为苹果。这样在最后的elasticsearch输出的信息中,每条日志信息会多出一个字段fruit,它的值为以上赋的值
问题3:在ingestNode中使用geoip解析ip的地理信息
在logstash中使用geoip,请看《kibana使用高德地图》,地址:http://blog.csdn.net/spring_ming/article/details/68060122
而在我们的项目中要只使用filebeat解析ip字段来获取地理位置。具体配置如下:
首先,安装geoip插件:
sudo bin/elasticsearch-plugin install ingest-geoip
其次,配置管道信息:
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip",
"database_file" : "GeoLite2-City.mmdb.gz"
}
}
]
}
geoip的具体参数配置见官网:https://www.elastic.co/guide/en/elasticsearch/plugins/5.4/using-ingest-geoip.html
有时候在配置完后geoip在kibana的tilemap中无法使用,这是解析出来的字段不是geo_point格式导致的,简单的办法是将index前缀改为logstash-*,因为logstash默认模版geoip.location为geo_point类型,需要在filebeat.yml中配置:
output.elasticsearch:
index : "logstash-%{+yyyy.MM.dd}"