logstash过滤器插件filter详解及实例

Logstash filter 的使用 阅读详情

1、logstash过滤器插件filter

1.1、grok正则捕获

grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。他是目前logstash 中解析非结构化日志数据最好的方式
grok的语法规则是:

%{语法:语义}

“语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样的IP地址。

grok官方文档地址
http://doc.yonyoucloud.com/doc/logstash-best-practice-cn/filter/grok.html

grok在线验证
http://grokdebug.herokuapp.com/

grok正则表达式:(?<temMsg>(.*)(?=Report)/?) 获取Report之前的字符
grok正则表达式:(?<temMsg>(?=Report)(.*)/?) 获取Report之后的字符
grok{
		match => { 
				 #截取<Report>之前的字符作为temMsg字段的值
				"message" => "(?<temMsg>(.*)(?=Report)/?)" 
			}
	}
这个是截取特定的字符集日志,要日志中包含了【Report】关键字

一串协议消息如 7e8900000c040116432693324af0010180010005e98e0706000a7e,要求利用grok截取7e后面的四个字符,利用grok正则表达式即可实现

filter{
     
     grok{
        match => {
                   "message" => "(?<mid>(?<=7e)(.{4}))"                
        	}
     }
}

输出
mid" => "8900"

代码解释:
message:即输入的数据信息。
mid:即输出结果的名称
(?<=7e):即表示获取7e后面的字符,但不包括7e
(.{4}):即表示获取的字符长度为4个。

更多实例

grok正则表达式:(?<temMsg>(?<=report).*?(?=msg)) 截取report和msg之间的值 不包含report和msg本身
grok正则表达式:(?<temMsg>(report).*?(?=msg)) 截取 包含report但不包含msg
grok正则表达式:(?<temMsg>(?<=report).*?(msg))截取  不包含report但包含msg
grok正则表达式:(?<temMsg>(report).*?(msg|request))输出以report开头,以msg或者以request结尾的所有包含头尾信息
grok正则表达式:(?<temMsg>(report).*?(?=(msg|request)))输出以report开头,以msg或者以request结尾的不包含头尾信息

参考样例:
https://blog.youkuaiyun.com/cai750415222/article/details/86614854

例如:

我们的试验数据是:

172.16.213.132 [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039

1)我们举个例子来讲解过滤IP

input {
        stdin {
        }
}
filter{
        grok{
                match => {"message" => "%{IPV4:ip}"}
        }
}
output {
                stdout {
                }
}

现在启动一下:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l2.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 [07/Feb/2018:16:24:19 +0800]"GET /HTTP/1.1" 403 5039      #手动输入此行信息
{
       "message" => "172.16.213.132 [07/Feb/2018:16:24:19 +0800]\"GET /HTTP/1.1\" 403 5039",
            "ip" => "172.16.213.132",
      "@version" => "1",
          "host" => "ip-172-31-22-29.ec2.internal",
    "@timestamp" => 2019-01-22T09:48:15.354Z
}

2)举个例子来讲解过滤时间戳

input与output字段信息这里省略不写了。

filter{
        grok{
                match => {"message" => "%{IPV4:ip}\ \[%{HTTPDATE:timestamp}\]"}
        }
}

接下来我们过滤一下:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l2.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 [07/Feb/2018:16:24:19 +0800]"GET /HTTP/1.1" 403 5039    手动输入此行信息
{
      "@version" => "1",
     "timestamp" => "07/Feb/2018:16:24:19 +0800",
    "@timestamp" => 2019-01-22T10:16:14.205Z,
       "message" => "172.16.213.132 [07/Feb/2018:16:24:19 +0800]\"GET /HTTP/1.1\" 403 5039",
            "ip" => "172.16.213.132",
          "host" => "ip-172-31-22-29.ec2.internal"
}

可以看到我们已经过滤成功了,在配置文件中grok其实是使用正则表达式来进行过滤的。我们做个小实验,比如我现在在例子中的数据ip后面添加两个“-”。如图所示:

172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039

那么此时在配置文件中我就需要这样子来写:

filter{
        grok{
                match => {"message" => "%{IPV4:ip}\ -\ -\ \[%{HTTPDATE:timestamp}\]"}
        }
}

那么此时在match行我就要匹配两个“-”,否则grok就不能正确匹配数据,从而不能解析数据。

启动一下来查看一下结果:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l2.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039      #手动输入此行内容,然后按下enter键。
{
    "@timestamp" => 2019-01-22T10:25:46.687Z,
            "ip" => "172.16.213.132",
       "message" => "172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] \"GET /HTTP/1.1\" 403 5039",
     "timestamp" => "07/Feb/2018:16:24:19 +0800",
      "@version" => "1",
          "host" => "ip-172-31-22-29.ec2.internal"
}

这时候我们就得到了信息,我这里是匹配IP和时间,当然你也可以直接匹配时间即可:

filter{
        grok{
                match => {"message" => "\ -\ -\ \[%{HTTPDATE:timestamp}\]"}
        }
}

这个时候我们更加能理解grok使用正则匹配数据了。

需要注意的是:正则中,匹配空格和中括号要加上转义符。

3)过滤出报文头信息

首先来写匹配的正则模式

filter{
        grok{
                match => {"message" => "\ %{QS:referrer}\ "}
        }
}

启动一下看看结果:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l2.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039
{
    "@timestamp" => 2019-01-22T10:47:37.127Z,
       "message" => "172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] \"GET /HTTP/1.1\" 403 5039",
      "@version" => "1",
          "host" => "ip-172-31-22-29.ec2.internal",
      "referrer" => "\"GET /HTTP/1.1\""
}

4)举一反三,我们尝试输出一下/var/log/message字段的时间信息。

例子的数据:

Jan 20 11:33:03 ip-172-31-22-29 systemd: Removed slice User Slice of root.

我们的目的是输出时间,也就是前三列而已。

这个时候我们可以去找匹配的正则有哪些,要去这个路径下找:/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns目录下的grok-patterns这个文件,我们发现了这个:
在这里插入图片描述
正好非常符合上面输出的信息。

首先写好配置文件

filter{
        grok{
                match => {"message" => "%{SYSLOGTIMESTAMP:time}"}
                remove_field => ["message"]
        }
}

启动一下看看情况:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l4.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties

Jan 20 11:33:03 ip-172-31-22-29 systemd: Removed slice User Slice of root.      #手动输入此行信息。
{
    "@timestamp" => 2019-01-22T11:54:26.646Z,
          "host" => "ip-172-31-22-29.ec2.internal",
      "@version" => "1",
          "time" => "Jan 20 11:33:03"
}

看到结果已经转换成功了,非常好用的工具。

1.2、date插件

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

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

filter{
        grok{
                match => {"message" => "\ -\ -\ \[%{HTTPDATE:timestamp}\]"}
        }
        date{
                match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
        }
}

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

启动一下我们看看效果:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l2.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039        #手动输入此行信息
{
          "host" => "ip-172-31-22-29.ec2.internal",
     "timestamp" => "07/Feb/2018:16:24:19 +0800",
    "@timestamp" => 2018-02-07T08:24:19.000Z,
       "message" => "172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] \"GET /HTTP/1.1\" 403 5039",
      "@version" => "1"
}

会发现@timestamp时间转换成功,因为我写这篇博客是在2019年1月22日写的。还有一点就是在时间少8个小时,你发现了吗?继续往下看

1.3、remove_field的用法

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

1)我们还是以输出IP为例:

filter{
        grok{
                match => {"message" => "%{IP:ip_address}"}
                remove_field => ["message"]
        }
        
}

启动服务查看一下:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l5.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039      #手动输入此行内容并按enter键
{
    "ip_address" => "172.16.213.132",
          "host" => "ip-172-31-22-29.ec2.internal",
      "@version" => "1",
    "@timestamp" => 2019-01-22T12:16:58.918Z
}

这时候你会发现没有之前显示的那个message的那一行信息了。因为我们使用remove_field把他移除了,这样的好处显而易见,我们只需要日志中特定的信息而已。

2)在上面的几个例子中我们是把message一行的信息一个一个分开演示了,现在我想在一个logstash中全部显示出来。

我们先在配置文件中配置一下:

filter{
        grok{
            match => {"message" => "%{IP:ip_address}\ -\ -\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:status}\ %{NUMBER:bytes}"}
        }
        date{
            match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
        }
        
}

启动一下,看看情况:

[root@172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l5.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039      #手动输入此行内容
{
"status" => "403",
"bytes" => "5039",
"message" => "172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] \"GET /HTTP/1.1\" 403 5039",
"ip_address" => "172.16.213.132",
"timestamp" => "07/Feb/2018:16:24:19 +0800",
"@timestamp" => 2018-02-07T08:24:19.000Z,
"referrer" => "\"GET /HTTP/1.1\"",
"@version" => "1",
"host" => "ip-172-31-22-29.ec2.internal"
}

在这个例子中,你能感受到输出内容的臃肿,相当于输出了两份的内容,因此我们很有必要将原始内容message的这一行给去掉。

3)使用remove_field去掉message这一行的信息。

首先我们修改一下配置文件:

filter{
        grok{
            match => {"message" => "%{IP:ip_address}\ -\ -\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:status}\ %{NUMBER:bytes}"}
        }
        date{
            match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
        }
        mutate{
            remove_field => ["message","timestamp"]
        }

启动一下看看:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l5.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039     #手动输入此行内容尝试一下
{
      "referrer" => "\"GET /HTTP/1.1\"",
         "bytes" => "5039",
          "host" => "ip-172-31-22-29.ec2.internal",
    "@timestamp" => 2018-02-07T08:24:19.000Z,
        "status" => "403",
    "ip_address" => "172.16.213.132",
      "@version" => "1"
}

看到了吗这就是我们想要的最终结果

1.4、时间处理(date)

上面有几个例子已经讲到了date的用法。date插件对于排序事件和回填旧数据尤其重要,它可以用来转换日志记录中的时间字段,变成Logstash::timestamp对象,然后转存到@timestamp字段里面。

为什么要使用这个插件呢?
  1、一方面由于Logstash会给收集到的每条日志自动打上时间戳(即@timestamp),但是这个时间戳记录的是input接收数据的时间,而不是日志生成的时间(因为日志生成时间与input接收的时间肯定不同),这样就可能导致搜索数据时产生混乱。

2、另一方面,在上面那段rubydebug编码格式的输出中,@timestamp字段虽然已经获取了timestamp字段的时间,但是仍然比北京时间晚了8个小时,这是因为在Elasticsearch内部,对时间类型字段都是统一采用UTC时间,而日志统一采用UTC时间存储,是国际安全、运维界的一个共识。其实这并不影响什么,因为ELK已经给出了解决方案,那就是在Kibana平台上,程序会自动读取浏览器的当前时区,然后在web页面自动将UTC时间转换为当前时区的时间。

如果你要解析你的时间,你要使用字符来代替,用于解析日期和时间文本的语法使用字母来指示时间(年、月、日、时、分等)的类型。以及重复的字母来表示该值的形式。在上面看到的"dd/MMM/yyy:HH:mm:ss Z",他就是使用这种形式,我们列出字符的含义:
在这里插入图片描述
那我们是依据什么写出“dd/MMM/yyy:HH:mm:ss Z”这样子的形式的呢?
这一点不好理解,给大家尽量说清楚。比如上面的试验数据是

172.16.213.132 - - [07/Feb/2018:16:24:19 +0800] "GET /HTTP/1.1" 403 5039

现在我们想转换时间,那就要写出"dd/MMM/yyy:HH:mm:ss Z",你发现中间有三个M,你要是写出两个就不行了,因为我们查表发现两个大写的M表示两位数字的月份,可是我们要解析的文本中,月份则是使用简写的英文,所以只能去找三个M。还有最后为什么要加上个大写字母Z,因为要解析的文本中含有“+0800”时区偏移,因此我们要加上去,否则filter就不能正确解析文本数据,从而转换时间戳失败。

1.5、数据修改mutate插件

mutate插件是logstash另一个非常重要的插件,它提供了丰富的基础类型数据处理能力,包括重命名、删除、替换、修改日志事件中的字段。我们这里举几个常用的mutate插件:字段类型转换功能covert、正则表达式替换字段功能gsub、分隔符分隔字符串为数值功能split、重命名字段功能rename、删除字段功能remove_field

1)字段类型转换convert

先修改配置文件:

filter{
        grok{
                match => {"message" => "%{IPV4:ip}"}
                remove_field => ["message"]
        }
        mutate{
                convert => ["ip","string"]
        }
}

或者这样子写也行,写法区别较小:

filter{
        grok{
                match => {"message" => "%{IPV4:ip}"}
                remove_field => ["message"]
        }
        mutate{
                convert => {
                        "ip" => "string"
                }
        }
}

现在我们启动服务查看一下效果:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l6.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties172.16.213.132 - - [07/Feb/2018:16:24:9 +0800] "GET /HTTP/1.1" 403 5039
{
    "@timestamp" => 2019-01-23T04:13:55.261Z,
            "ip" => "172.16.213.132",
          "host" => "ip-172-31-22-29.ec2.internal",
      "@version" => "1"
}

在这里的ip行中,效果可能不太明显,但是确实是已经转化成string模式了。

2)正则表达式替换匹配字段
gsub可以通过正则表达式替换字段中匹配到的值,但是这本身只对字符串字段有效。

首先把修改配置文件看看

filter{
        grok{
                match => {"message" => "%{QS:referrer}"}
                remove_field => ["message"]
        }
        mutate{
                gsub => ["referrer","/","-"]
        }
}

启动一下看看效果:

172.16.213.132 - - [07/Feb/2018:16:24:9 +0800] "GET /HTTP/1.1" 403 5039
{
          "host" => "ip-172-31-22-29.ec2.internal",
    "@timestamp" => 2019-01-23T05:51:30.786Z,
      "@version" => "1",
      "referrer" => "\"GET -HTTP-1.1\""
}

很不错,确实对QS的部分的分隔符换做横杠了

3)分隔符分隔字符串为数组
split可以通过指定的分隔符分隔字段中的字符串为数组。

首先配置文件

filter{
        mutate{
                split => ["message","-"]
                add_field => ["A is lower case :","%{[message][0]}"]
        }
}

这里的意思是对一个字段按照“-”进行分隔为数组

启动一下:

a-b-c-d-e-f-g            #手动输入此行内容,并按下enter键。
{
    "A is lower case :" => "a",
              "message" => [
        [0] "a",
        [1] "b",
        [2] "c",
        [3] "d",
        [4] "e",
        [5] "f",
        [6] "g"
    ],
                 "host" => "ip-172-31-22-29.ec2.internal",
             "@version" => "1",
           "@timestamp" => 2019-01-23T06:07:18.062Z
}

4)重命名字段

rename可以实现重命名某个字段的功能。

filter{
        grok{
                match => {"message" => "%{IPV4:ip}"}
                remove_field => ["message"]
        }
        mutate{
                convert => {
                        "ip" => "string"
                }
                rename => {
                        "ip"=>"IP"
                }
        }
}

rename字段使用大括号{}括起来,其实我们也可以使用中括号达到同样的目的

mutate{
                convert => {
                        "ip" => "string"
                }
                rename => ["ip","IP"]
        }

启动后检查一下:

172.16.213.132 - - [07/Feb/2018:16:24:9 +0800] "GET /HTTP/1.1" 403 5039      #手动输入此内容
{
      "@version" => "1",
    "@timestamp" => 2019-01-23T06:20:21.423Z,
          "host" => "ip-172-31-22-29.ec2.internal",
            "IP" => "172.16.213.132"
}

5)删除字段,这个不多说,我们上面已经有例子了。

6)添加字段add_field。

添加字段多用于split分隔中,主要是对split分隔后的字段中指定格式输出。

filter {
  mutate {
    split => ["message", "|"]
      add_field => {
        "timestamp" => "%{[message][0]}"
    }
 }
}

添加字段后,该字段会与@timestamp一样同等格式显示出来。

1.6、geoip地址查询归类

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

首先我们修改一下配置文件来看看

filter{
        grok {
                match => {
                        "message" => "%{IP:ip}"
                }
                remove_field => ["message"]
        }
        geoip {
                source => "ip"
        }
}

中间match的部分也可以替换成下图例子:

grok {
             match => ["message","%{IP:ip}"]
             remove_field => ["message"]
      }    

启动一下看看效果:

[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l7.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
114.55.68.111 - - [07/Feb/2018:16:24:9 +0800] "GET /HTTP/1.1" 403 5039      #手动输入此行信息
{
            "ip" => "114.55.68.111",
         "geoip" => {
             "city_name" => "Hangzhou",
           "region_code" => "33",
              "location" => {
            "lat" => 30.2936,
            "lon" => 120.1614
        },
             "longitude" => 120.1614,
              "latitude" => 30.2936,
         "country_code2" => "CN",
              "timezone" => "Asia/Shanghai",
                    "ip" => "114.55.68.111",
         "country_code3" => "CN",
        "continent_code" => "AS",
          "country_name" => "China",
           "region_name" => "Zhejiang"
    },
          "host" => "ip-172-31-22-29.ec2.internal",
      "@version" => "1",
    "@timestamp" => 2019-01-23T06:47:51.200Z
}

成功了。

但是上面的内容并不是每个都是我们想要的,因此我们可以选择性的输出。

继续修改内容如下:

filter{
        grok {
                match => ["message","%{IP:ip}"]
                remove_field => ["message"]
        }
        geoip {
                source => ["ip"]
                target => ["geoip"]
                fields => ["city_name","region_name","country_name","ip"]
        }
}

启动一下看看:

114.55.68.111 - - [07/Feb/2018:16:24:9 +0800] "GET /HTTP/1.1" 403 5039      #手动输入此行信息
{
    "@timestamp" => 2019-01-23T06:57:29.955Z,
            "ip" => "114.55.68.111",
         "geoip" => {
           "city_name" => "Hangzhou",
                  "ip" => "114.55.68.111",
        "country_name" => "China",
         "region_name" => "Zhejiang"
    },
      "@version" => "1",
          "host" => "ip-172-31-22-29.ec2.internal"
}

发现输出的内容果然变少了,我们想输出什么他就输出什么内容。

1.7、filter插件综合应用。

我们的业务例子如下所示:

112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"

日志中的双引号、单引号、中括号等不能被正则解析的都要加上转义符号,详情可见这里:https://www.cnblogs.com/ysk123/p/9858387.html

现在我们修改配置文件进行匹配

filter{
        grok {
                match => ["message","%{IPORHOST:client_ip}\ -\ -\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:status}\ %{NUMBER:bytes}\ \"-\"\ \"%{DATA:browser_info}\ %{GREEDYDATA:extra_info}\"\ \"-\""]
        }
        geoip {
                source => ["client_ip"]
                target => ["geoip"]
                fields => ["city_name","region_name","country_name","ip"]
        }
        date {
                match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
        }
        mutate {
                remove_field => ["message","timestamp"]
        }
}

然后启动一下看看效果:

[root@:vg_adn_tidbCkhsTest:23.22.172.65:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l9.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"
{
        "referrer" => "\"GET / HTTP/1.1\"",
           "bytes" => "190",
       "client_ip" => "112.195.209.90",
      "@timestamp" => 2018-02-20T04:12:14.000Z,
    "browser_info" => "Mozilla/5.0",
      "extra_info" => "(Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36",
          "status" => "200",
            "host" => "ip-172-31-22-29.ec2.internal",
        "@version" => "1",
           "geoip" => {
           "city_name" => "Chengdu",
         "region_name" => "Sichuan",
        "country_name" => "China",
                  "ip" => "112.195.209.90"
    }
}

上面红色字体的是我们手动输入进去的内容,下面金色字体是系统反馈给我们的信息。

通过信息我们可以查看信息已经过滤成功了。非常好。

注意:有一点需要注意:在匹配信息的时候,GREEDYDATA与DATA匹配的机制是不一样的,GREEDYDATA是贪婪模式,而DATA则是能少匹配一点就少匹配一点。通过上面的例子大家再体会一下。

最后给大家提供一个可以快速调试grok正则表达式的网站:http://grokdebug.herokuapp.com/ 。目的就是帮助万魔门编写grok正则匹配组合语句。

原文出处

logstash过滤器插件filter详解及实例
https://www.cnblogs.com/FengGeBlog/p/10305318.html

logstash grok插件语法介绍 grok插件语法介绍 阅读详情

相关推荐

grok 官方文档

grok: 解析任意文本并构造它: Grok 是当前最好的方式在logstash 解析蹩脚的非结构化日志数据 到一些结构化的可查询的。 这个工具是完美的对于syslog logs, apache和其他webserver logs,mysqllogs,在一般情况下,任何日志格式 通常对于人是友好的而不是对于电脑 Logstash 有120种模式默认,你可以找到它们在:https:/

zhaoyangjian724的专栏 1万+

logstash filter 过滤器详解

logstash filter 插件详解

magic_kid_2010的专栏 1万+

STM32CubeMX 6.4.0 + STM32F407ZGT6 实战:基于YT8512C PHY的lwIP以太网配置与调试

本文详细介绍了使用STM32CubeMX 6.4.0为STM32F407ZGT6微控制器配置YT8512C PHY芯片,并成功移植lwIP以太网协议栈的实战过程。文章从硬件差异分析入手,逐步讲解时钟配置、ETH外设设置、PHY寄存器适配以及lwIP协议栈剪裁等关键步骤,旨在帮助开发者解决非标准PHY芯片的联网难题,最终实现网络连通与Ping测试。

n8m7b6v5c4的博客 592

logstash过滤器插件filter详解及实例_logstash filter 时间戳

这个时候我们更加能理解grok使用正则匹配数据了。需要注意的是:正则中,匹配空格和中括号要加上转义符。

2401_84715926的博客 1822

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5941

Dify+工作流,通过多模态实现发票自动识别

上个章节我们用Dify实现了基于本地知识库的聊天助手,本节我们通过工作流 ,可视化界面快速构建复杂的工作流和自动化流程。结合 OCR(光学字符识别)技术和工作流引擎,可以实现发票的自动识别、数据提取以及后续的审批流程。本文将详细介绍如何使用 Dify 和工作流来实现发票的自动识别与审批。

odin2005的博客 7425

logstash过滤器插件filter详解

1、logstash过滤器插件filter 1.1、grok正则捕获 grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。他是目前logstash 中解析非结构化日志数据最好的方式 grok的语法规则是: %{语法:语义} “语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹...

snail_bi的博客 911

差分放大电路的计算

反馈,对于运算放大电路来说,运放工作在线性区,所以这里一定是负反馈,没有反馈(开环)或者是正反馈,那是比较器电路而不是放大电路,这时候运放工作在饱和区或称为非线性工作区,正因为饱和,输出才是电源电压的幅值。图2是一种带正反馈的运放电路,这里就不能叫运算放大电路了,因为运放的开环放大倍数理想是无限大,当然实际中不可能无限大,所以如下结构是迟滞电压比较器,运放工作在非线性区或饱和区。实际应用电路中,我们为了简化计算,也是用最简方法计算,经常使用的电路也是上述电路,令电阻相等关系,简化计算。

qq_40170041的博客 350

Logstash过滤器插件filter

grok正则捕获 grok是一个十分强大的logstash filter插件,它可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。它是目前Logstash中解析非结构化日志数据最好的方式 grok的语法规则: %{语法:语义} “语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样的IP地址 举例: 原始数据:172.16.213.132 [07/Feb/2018:16:24:19 +0800] “GET /HTTP/1.1” ..

sinat_34241861的博客 643

【MATLAB】嵌入式PID控制参数整定与优化

本文提出了一种基于MATLAB仿真的嵌入式PID参数优化方法,解决了传统人工试凑法效率低、适应性差的问题。通过建立一阶滞后被控对象模型,对比分析了不同PID参数组合的性能表现,筛选出最优参数。仿真结果表明,优化后的PID参数能有效降低超调量(从传统方法的显著超调降至接近0%),缩短调节时间,提高稳态精度。最终将优化算法部署到STM32平台,实现了"仿真整定-参数优化-嵌入式落地"的完整开发流程。该方法显著提升了嵌入式系统的响应速度和控制精度,为工业控制应用提供了标准化解决方案。

unber的博客 45

流体动力学仿真软件:SU2_(1).SU2简介与安装

SU2 是一个开源的计算流体动力学(CFD)和计算结构动力学(CSD)仿真软件,由斯坦福大学的航空航天系开发。它主要用于解决流体动力学问题,包括但不限于空气动力学、热力学、化学反应流等。SU2 的特点在于其高度的灵活性和可扩展性,使其成为科研和工业领域中非常受欢迎的工具。SU2 采用有限体积法(FVM)和有限元法(FEM)进行数值求解,支持多种物理模型和求解器,如 Euler 方程、Navier-Stokes 方程、RANS 方程等。

kkchenjj的博客 1308

filter过滤器_logstash过滤器插件filter详解及实例

logstash过滤器插件filtergrok正则捕获grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。他是目前logstash 中解析非结构化日志数据最好的方式grok的语法规则是:%{语法:语义}“语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样...

weixin_39550486的博客 482

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

过滤内容字段_logstash过滤器插件filter详解及实例

logstash过滤器插件filtergrok正则捕获grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。他是目前logstash 中解析非结构化日志数据最好的方式grok的语法规则是:%{语法:语义}“语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样...

weixin_34221330的博客 2253

【目标追踪】python背景模型减除法原理及其实现

python基于背景模型差法的视频目标追踪帧差法的问题:背景模型差法目标追踪原理1. 基本思路:2. 图例讲解:3. 存在的问题&如何解决:4. 最终效果预览第一步——调用摄像头:1. 使用opencv打开视频or摄像头:2. 读取逐帧图片:第二步——处理图片:1. 转换成灰度图:3. 累加权重重构背景:3. 计算像素差:3. 使用中值滤波和膨胀腐蚀去噪:3.1 中值滤波:3.2 图像腐蚀...

梁瑛平的博客 1947

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

5.Logstash插件—过滤器插件(Filter)

5.1 Grok 正则捕获 5.1.1 正则表达式语法 可以在 grok 里写标准的正则: \s+(?<request_time>\d+(?:\.\d+)?)\s+ 给配置文件添加第一个过滤器区段配置 配置要添加在输入和输出区段之间: 运行 logstash 进程然后输入 “begin 123.456 end”: 5.1.2 Grok 表达式语法 示例: 第一行,用普通的正则表达式来定义一个 grok 表达式 第二行,通过打印赋值格式,用前面定义好的 grok 表达式

大勇若怯任卷舒 937

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

logstash 学习三 过滤器插件(Filter)

丰富的过滤器插件是logstash 如此强大的一个很重要的因素。这篇主要来说说我常用的一些插件。 过滤屏蔽不需要的日志 : 先来看一下日志吧。下面是tomcat 报的一些日志: 2016-06-17 13:54:24,148 INFO (com.yudao.framework.db.connection.LocalDataSourceFactory:35) - loadJDBCConfig...

愚道的专栏 2290

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Logstash【从无到有从有到无】【L19】过滤器插件(Filter plugins)

1.过滤器插件 过滤器插件对事件执行中介处理。 通常根据事件的特征有条件地应用过滤器。 以下过滤器插件在下面可用。 有关Elastic支持的插件的列表,请查阅Support Matrix。 Plugin Description Github repository aggregate 汇总来自单个任务的多个事件的信息 logstash-filter-aggregat...

琴韵悠悠 1142

Logstash_过滤器生态系统

如果说Input是“收集”,Output是“投递”,那么Filter就是真正的“价值创造”环节。它通过将文本模式匹配与正则表达式相结合,将非结构化的日志数据解析成结构化的、可查询的字段。Filter插件是Logstash的灵魂,它们将原始数据转化为有价值的、结构化的信息。:在处理应用程序日志时,将单调的用户ID丰富为更具可读性的用户名和部门信息。如果事件中某个字段是数组,可以使用此过滤器将数组拆分为多个独立的事件。过滤器是修改事件字段的“瑞士军刀”,它提供了最基础的字段操作功能。

chenglin016的博客 1123
上一篇: Kibana7.x基本的操作
下一篇: Kibana导入CVS数据
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值