Logstash

您所在的位置:网站首页 access从字段提取出数字 Logstash

Logstash

2023-09-05 07:27| 来源: 网络整理| 查看: 265

Logstash 支持不同的数据源头,在数据从源头到目标的过程中,Logstash提供了对数据处理的操作。对数据的操作需要配置filter的内容。

关于安装Logstash的安装可以看之前的文章安装Logstash并完成一个简单的日志收集功能

Logstash过滤器根据规则提取数据

Logstash涉及提取数据主要是下面几个

date过滤器:获得时间格式的数据extractnumbers过滤器:从字符串中提取数字grok过滤器:使用grok格式提取数据中的指定内容

这里我简单的介绍下几个过滤器的使用方式,当然实际上Logstash提供了更多的可能,但是很多时候我们并不需要这么多复杂的功能,但是在某些情况下需要配合当前的业务需要实现一些复杂的解析。这里推荐直接查看 Logstash的文档,毕竟文档才是最可靠的技术来源。

date过滤器

用于解析事件中的时间数据

可配置的参数

参数作用参数类型locale指定用于日期解析的区域设置stringmatch如何匹配时间格式arraytag_on_failure匹配失败后追加的内容arraytarget匹配成功后的内容需要设置的目标字段stringtimezone指定用于日期解析的时区规范IDstring 例子

配置

input { redis { key => "logstash-date" host => "localhost" password => "dailearn" port => 6379 db => "0" data_type => "list" type => "date" } } filter { date { match => [ "message", "yyyy-MM-dd HH:mm:ss" ] locale => "Asia/Shanghai" timezone => "Europe/Paris" target => "messageDate" } } output { stdout { codec => rubydebug } }

测试数据

2020-05-07 23:59:59

控制台输出

{ "@timestamp" => 2020-05-12T13:47:26.094Z, "type" => "date", "tags" => [ [0] "_jsonparsefailure" ], "@version" => "1", "message" => "2020-05-07 23:59:59", "messageDate" => 2020-05-07T21:59:59.000Z }

需要注意我是在2020-05-12 21:47:26发送的消息,而服务器使用的时区为UTC/GMT 0。所以这个时候我插入了2020-05-07 23:59:59的时间,被指定为Europe/Paris时区,所以最后被转为2020-05-07T21:59:59.000Z

extractnumbers过滤器

注意默认情况下次过滤器为捆绑需要执行bin/logstash-plugin install logstash-filter-extractnumbers操作安装插件

此过滤器自动提取字符串中找到的所有数字

可配置的参数

参数作用参数类型source要进行操作的字段string

配置

input { redis { key => "logstash-extractnumbers" host => "localhost" password => "dailearn" port => 6379 db => "0" data_type => "list" type => "extractnumbers" } } filter { extractnumbers { source => "message" target => "message2" } } output { stdout { codec => rubydebug } }

测试数据

zhangSan5,age16 + 0.5 456 789

控制台输出

{ "float1" => 0.5, "int2" => 789, "int1" => 456, "@timestamp" => 2020-05-17T03:51:23.695Z, "@version" => "1", "type" => "extractnumbers", "message" => "zhangSan5,age16 + 0.5 456 789", "tags" => [ [0] "_jsonparsefailure" ] }

虽然文档中介绍,此过滤器会尝试提取出字符串中所有的字段,但是实际中部分和字母结合的字符串结构并没有被提取出来,而那些被字母和其他符号被包裹起来的数字没有被完整的提取出来,比如之前测试的时候使用的zhangSan5,age16 + 0.5,456[789],888这样的数据就没有任何内容被提取出来。

grok过滤器

grok是使用正则去匹配文本中的关联数据,有关正则的规则可以查看GitHub上的文件:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns 。 而使用grok的常用语法:%{SYNTAX:SEMANTIC} SYNTAX代表匹配值类型,SEMANTIC代表赋值字段名称。

对任何文本进行结构化解析

可配置的参数

参数作用参数类型break_on_matchgrok的首次成功匹配将导致过滤器完成。如果设置为false。grok尝试所有模式booleankeep_empty_captures如果为true,则将空捕获保留为事件字段。booleanmatch它定义了查找位置和模式的映射。hashnamed_captures_only如果为true,则仅存储来自grok的命名捕获。booleanoverwrite需要覆盖的字段arraypattern_definitions模式名称和模式元组的散列,定义了当前过滤器要使用的自定义模式hashpatterns_dir可以使用此设置指向多个匹配目录arraypatterns_files_glob用于在patterns_dir指定的目录中选择模式文件stringtag_on_failure解析失败时需要添加的标记arraytag_on_timeout超时时需要添加的标记stringtimeout_millis匹配的超时时间numbertimeout_scope默认为"pattern"如果向提供了多个模式match,则会在每个匹配模式上应用超时,如果设置为"event"则在所有匹配中执行一次超时string,可选参数"pattern"和"event"

配置

input { redis { key => "logstash-grok" host => "localhost" password => "dailearn" port => 6379 db => "0" data_type => "list" type => "grok" } } filter { grok { match => { "message" => "%{USER:name} %{INT:age} %{WORD:desc}" } } } output { stdout { codec => rubydebug } }

测试数据

zhangSan 10 hello

控制台输出

{ "desc" => "hello", "type" => "grok", "@version" => "1", "tags" => [ [0] "_jsonparsefailure" ], "age" => "10", "message" => "zhangSan 10 hello", "@timestamp" => 2020-05-12T14:07:50.282Z, "name" => "zhangSan" }

需要注意的是,grok严格的使用与之匹配的正则表达式,如果使用错误的内容,其匹配结果可能不是设计的内容。

比如使用下面的输入内容

zhangSan-10-hello

其可能就无法被grok解析,并且打上_grokparsefailure的标签

{ "type" => "grok", "@version" => "1", "message" => "zhangSan-10-hello", "@timestamp" => 2020-05-12T14:08:00.755Z, "tags" => [ [0] "_jsonparsefailure", [1] "_grokparsefailure" ] }

当然尝试修改匹配规则,然后使用上面的数据请求也可以拿到正确结果

match => { "message" => "%{USER:name}-%{INT:age}-%{WORD:desc}" }

个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3