logstash filter 的使用

前言

filter 插件是logstash功能强大的主要原因,它可以对logstash event进行丰富的处理,可以说是解析数据、删除字典、类型转换等,常见的有以下几种

1、grok:正则匹配解析

2、date:日期分析

3、dissect:分割符分析

4、mutate:对字段做处理,比如重命名、删除、替换等

5、json:按照json解析字段内容到指定字段中

6、geoip:增加地理位置数据

7、rubu:利用ruby代码来动态修改logstash event

1、Grok插件

他是一个logstash filter插件,它可以通过通过正则表达式解析任意文本,将非结构化的日志数据解析成结构化和方便查询的结构化内容。

使用 grik filter需要在logstash的配置文件中增加这样的内容

filter {

    grok {

        match => {

                    "message" => "grok_pattern"

                }

    }

}

这段代码中除了grok_patterm之外都是logstash的关键字。

grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成

其中SYHTAX是表达式的名字,即数字表达式的名称

SEMANTIC表示解析出来的字段名字,是自己定义的,为匹配的文本提供的标识符

例如IP字段的名字可以是client。【syntax [ˈsɪntæks]语法,semantic [sɪˈmæntɪk]语义】

 

对于下面这条日志:

 192.168.1.2 GET /index.html 15824 0.043

 可以这样解析:

 

 将会得到这样的结果:

* client: 192.168.1.2

* method: GET

* request: /index.html

* bytes: 15824

* duration: 0.043

数字表达式的名字NUMBER,%{NUMBER:duration}可以匹配数值类型,但是grok匹配出的内容都是字符串类型,可以通过在最后指定为int或者float来强制转换类型。%{NUMBER:duration:float}

data_type 目前只支持两个值:int 和 float。

 grok提供了哪些SYNTAX?可以查看文件grok-patterns,它默认放在路径/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/目录下。

 测试:创建一个测试配置文件,如test.conf,内容如下:

input {stdin{}}

filter {

     grok {

        match => {

            "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"

        }

     }

}

output {stdout{codec => rubydebug}}

使用test.conf启动一个logstash实例,通过键盘输入以下内容

192.168.1.2 GET /index.html 15824 0.043

默认调用的是:

/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/这个目录下的正则

1.2、自定义SYNTAX

1、直接在grok黎明使用自定义表达式

格式:(?<filed_name>pattern)

?<filed_name>表示要取出里面的值,pattern就是正则表达式

例如:定制化字段,取出想要的字段

 “10.15 beijing sunny”,然后取出每一个字段

 编辑test.conf文件,内容如下

vim /usr/local/logstash-7.3.0/config/test.conf

input {stdin{}}

filter {

     grok {

        match => {

            "message" => "(?<date>\d+\.\d+)\s+(?<city>\w+)\s+(?<weather>\w+)"

        }

     }

}

output {stdout{codec => rubydebug}}

运行logstash,输入“10.15 beijing sunny”内容,并查看输出结果

 logstash -f /usr/local/logstash-7.3.0/config/test.conf

2、自定义表达式文件

在某个目录下创建一个文件,文件名自定义,如在/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/目录下创建正则表达式文件test

90

将目录加入grok路径: patterns_dir => "./patterns"

将想要增加的正则表达式写入,格式:SYNTAX_NAME regexp

使用方法和使用默认SYNTAX相同:%{SYNTAX_NAME:SEMANTIC}

例如:使用grok自定义正则去匹配下边的日志

10.173.28.112  2018-11-22 16:30:58  GET  /AUTO/users/loginSuccess.do  200  46112  0.075

在/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/目录下创建正则表达式文件test,内容如下

编辑logstash配置文件test.conf文件,内容如下

vim /usr/local/logstash-7.3.0/config/test.conf

运行logstash查看结果

总结:

 grok是通过系统的正则表达式或者通过自己定义的正则表达式来匹配日志中的各个值

正则解析比较容易出错,建议先调试,kibana提供了grok debbuger

 2、使用Grok Filter插件编辑解析nginx日志

grok作为一个logstash的过滤插件,支持根据正则表达式解析文本日志行。在生产环境中,nginx日志格式往往使用的是自定义的格式,我们需要把logstash中的message结构化后再存储,方便kibana的搜索和统计,因此需要对message进行解析。

2.1、nginx日志格式

log_format配置如下

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

access_log  logs/access.log  main;

$remote_addr变量:记录了客户端的IP地址(普通情况下)。

$remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。

$time_local变量:记录了当前日志条目的时间。

$request变量:记录了当前http请求的方法、url和http协议版本。

$status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。

$body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。

$http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。

$http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。

$http_x_forwarded_for变量:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。

对应的日志如下:

192.168.1.2 - - [16/Oct/2019:08:51:40 +0800] "GET /index.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" "-"

2.2、编写正则表达式

logstash中默认存在一部分正则让我们来使用,在如下的文件中我们可以看到:

/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns

  基本定义在grok-patterns中,我们可以使用其中的正则,当然并不是所有的都适合nginx字段,这时就需要我们自定义正则,然后通过指定patterns_dir来调用。

  同时在写正则的时候可以使用Grok Debugger或者Grok Comstructor工具来帮助我们更快的调试。在不知道如何使用logstash中的正则的时候也可使用Grok Debugger的Descover(https://grokdebug.herokuapp.com/)来自动匹配。(注意网络是否通,需要墙)

编写一个符合这台nginx服务器的日志过滤器

cd /usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/

vim nginx-access 

 2.3、编写logatsh配置文件

Logstash基本格式 input >> codec >> filter >> codec >> output ,codec用于文字编码格式转换

配置logsatsh

input{

    kafka {

        codec => "json"  #指明codec为json,因为logstash从kafka读取的日志是json格式

        bootstrap_servers => "192.168.1.7:9092"

        client_id => "nginx_logs"

        group_id => "nginx_logs"

        consumer_threads => 5

        auto_offset_reset => "latest"

        decorate_events => true

        topics => "nginx_logs"

    }

}

filter {

  grok {

    patterns_dir => "/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns"

    match => { "message" => "%{NGINXACCESS}" }

    remove_field => "message"    #过滤后丢弃原有信息

  }

}

output {

  stdout {

      codec => "rubydebug"

  }

  elasticsearch {

      hosts => [ "192.168.1.4:9200" ]

      index => "nginx-logs-%{+YYYY.MM.dd}"

  }

}

 注:remove_field的用法也是很常见的,他的作用就是去重,在前面的例子中你也看到了,不管是我们要输出什么样子的信息,都是有两份数据,即message里面是一份,NGINXACCESS里面也有一份,这样子就造成了重复,过滤的目的就是筛选出有用的信息,重复的不要

重启logstash 

 

打开kibana查看日志信息

 3.4、date插件

在上面我们有个例子中用到了timestamp字段,表示日志生成的时间。但是在显示的时候除了显示你指定的timestamp外,还有一行是@timestamp信息,这两个时间是不一样的,Logstash会给收集到的每条日志自动打上时间戳(即@timestamp,表示系统当前时间),但是这个时间戳记录的是input接收数据的时间,而不是日志生成的时间(因为日志生成时间与input接收的时间肯定不同),两个时间并不是一回事,在ELK的日志处理系统中,@timestamp字段会被elasticsearch用到,用来标注日志的生产时间,如此一来,日志生成时间就会发生混乱,要解决这个问题,需要用到另一个插件,即date插件,这个时间插件用来转换日志记录中的时间字符串,变成Logstash::Timestamp对象,然后转存到@timestamp字段里面。

接下来我们在logstash配置文件中配置一下:

vim /usr/local/logstash-7.3.0/config/http_logstash.conf

input{

    kafka {

        codec => "json"

        bootstrap_servers => "192.168.1.13:9092"

        client_id => "nginx_logs"

        group_id => "nginx_logs"

        consumer_threads => 5

        auto_offset_reset => "latest"

        #decorate_events => true

        topics => "nginx_logs"

    }

}

filter {

  grok {

    patterns_dir => "/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns"

    match => { "message" => "%{NGINXACCESS}" }

    #match => { "message" => "%{COMBINEDAPACHELOG}" }

    remove_field => "message"

  }

  date {

    match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]

  }

}

output {

  stdout {

      codec => "rubydebug"

  }

  elasticsearch {

      hosts => [ "192.168.1.11:9200" ]

      index => "nginx-logs-%{+YYYY.MM.dd}"

  }

}

 logstash -f /usr/local/logstash-7.3.0/config/http_logstash.conf

注意:时区偏移量需要用一个字母Z来转换。还有这里的“dd/MMM/yyyy”,你发现中间是三个大写的M,没错,这里确实是三个大写的M,我尝试只写两个M的话,转换失败。

 启动一下我们看看效果:

 

会发现@timestamp时间转换成功。

 如果你要解析你的时间,你要使用字符来代替,用于解析日期和时间文本的语法使用字母来指示时间(年、月、日、时、分等)的类型。以及重复的字母来表示该值的形式。在上面看到的"dd/MMM/yyy:HH:mm:ss Z",他就是使用这种形式,我们列出字符的含义:

3.5、Geoip Filter

geoip是常见的免费的IP地址归类查询库,geoip可以根据IP地址提供对应的地域信息,包括国别,省市,经纬度等等,此插件对于可视化地图和区域统计非常有用。

 该geoip插件配置要求指定包含IP地址来查找源字段的名称。在此示例中,该clientip字段包含IP地址。

 由于过滤器是按顺序进行评估,确保该geoip部分是在grok配置文件之后,无论是grok和geoip部分嵌套在内部filter部分

vim /usr/local/logstash-7.3.0/config/http_logstash.conf

input{

    kafka {

        codec => "json"

        bootstrap_servers => "192.168.1.7:9092"

        client_id => "nginx_logs"

        group_id => "nginx_logs"

        consumer_threads => 5

        auto_offset_reset => "latest"

        #decorate_events => true

        topics => "nginx_logs"

    }

}

filter {

  grok {

    patterns_dir => "/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns"

    match => { "message" => "%{NGINXACCESS}" }

    #match => { "message" => "%{COMBINEDAPACHELOG}" }

    remove_field => "message"

  }

  date {

    match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]

  }

  geoip {

        source => "clientip"

  }

}

output {

  stdout {

      #codec => "rubydebug"

  }

  elasticsearch {

      hosts => [ "192.168.1.4:9200" ]

      index => "nginx-logs-%{+YYYY.MM.dd}"

  }

}

logstash -f /usr/local/logstash-7.3.0/config/http_logstash.conf    #重启

在nginx服务器上插入测试数据

echo  '61.135.169.125 - - [16/Oct/2019:20:48:02 +0800] "GET /index.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" "-"'>> /usr/local/nginx/logs/access.log

在这里我们填写一个百度的ip进行测试

解析到的ip是中国、北京。就成功了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

Flying Pig!

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值