关于filebieat和IngestNode的踩坑记录

80 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情

前言

由于性能问题,我们经常使用filebeat代替logstash做日志收集,用elasticsearch的ingestNode做字段的过滤相关。这其中有不少问题,下面和大家说一下在过程中遇到的坑。让大家在做相关功能时可以更顺利。

首先关于ingestNode代替logstash做字段的提取,请看另一篇博文,地址:使用filebeat代替logstash进行信息过滤 - 掘金 (juejin.cn)

在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的地理信息

在项目中很多时候我们需要根据ip来获取地址信息,这个时候就需要geoip,在logstash中使用geoip, 而在我们的项目中要只使用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的具体参数配置见官网:www.elastic.co/guide/en/el…

有时候在配置完后geoip在kibana的tilemap中无法使用,这是解析出来的字段不是geo_point格式导致的,简单的办法是将index前缀改为logstash-*,因为logstash默认模版geoip.location为geo_point类型,需要在filebeat.yml中配置:

output.elasticsearch: index : "logstash-%{+yyyy.MM.dd}"