logstash常用filter插件介绍(代码片段)

author author     2023-02-02     698

关键词:

Filter是Logstash功能强大的主要原因,它可以对Logstash Event进行丰富的处理,比如说解析数据、删除字段、类型转换等等,常见的有如下几个:

  • date:日志解析
  • grok:正则匹配解析
  • dissect:分割符解析
  • mutate:对字段做处理,比如重命名、删除、替换等
  • json:按照 json 解析字段内容到指定字段中
  • geoip:增加地理位置数据
  • ruby: 利用 ruby 代码来动态修改 Logstash Event

data

从字段解析日期以用作事件的Logstash时间戳,以下配置解析名为logdate的字段以设置Logstash时间戳:

filter 
  date 
    match => [ "logdate", "MMM dd yyyy HH:mm:ss" ]
  

返回结果:

"logdate":"Jan 01 2018 12:02:03" 

      "@version" => "1",
          "host" => "Node2",
    "@timestamp" => 2018-01-01T04:02:03.000Z,
       "logdate" => "Jan 01 2018 12:02:03"

说明:

match => [ "logdate", "MMM dd yyyy HH:mm:ss" ,"MMM d yyyy HH:mm:ss","ISO8601"]

match:类型为数组,用于指定日期匹配的格式,可以一次指定多种日志格式
target:类型为字符串,用于指定赋值的字段名,默认是@timestamp
timezone:类型为字符串,用于指定时区

grok插件

将非结构化事件数据分析到字段中。 这个工具非常适用于系统日志,Apache和其他网络服务器日志,MySQL日志,以及通常为人类而不是计算机消耗的任何日志格式。

55.3.244.1 GET /index.html 15824 0.043

以下配置将消息解析为字段:

filter 
  grok 
    match =>  "message" => "%IP:client %WORD:method %URIPATHPARAM:request %NUMBER:bytes %NUMBER:duration" 
  

应用过滤器后,示例中的事件将具有以下字段:

client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043

Grok语法:

%SYNTAX:SEMANTIC:SYNTAX为grok pattern的名称,SEMANTIC为赋值字段名称
%NUMBER:duration:可以匹配数值类型,但是grok匹配出的内容都是字符串类型,可以通过在最后指定为int或者float来强制转换类型。
%NUMBER:duration:float

常见pattern可以查看:GitHub或者logstash家目录下的:

vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns

我们也可以自定义规则,比如我们下面添加的nginx日志的规则,放到上面的grok-patterns里面:

# Nginx logs
NGUSERNAME [a-zA-Z.@-+_%]+
NGUSER %NGUSERNAME
NGINXACCESS %IPORHOST:clientip %NGUSER:ident %NGUSER:auth [%HTTPDATE:timestamp] "%WORD:verb %URIPATHPARAM:request HTTP/%NUMBER:httpversion" %NUMBER:response (?:%NUMBER:bytes|-) (?:"(?:%URI:referrer|-)"|%QS:referrer) %QS:agent

我们也可以在安装的Kibana进行调试。

技术分享图片

dissect 插件

基于分隔符原理解析数据,解决grok解析时消耗过多cpu资源的问题

使用分隔符将非结构化事件数据提取到字段中。 解剖过滤器不使用正则表达式,速度非常快。 但是,如果数据的结构因行而异,grok过滤器更合适。

dissect的应用有一定的局限性:主要适用于每行格式相似且分隔符明确简单的场景
dissect语法比较简单,有一系列字段(field)和分隔符(delimiter)组成

%字段
%之间是分隔符

例如,假设日志中包含以下消息:

Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool...

以下配置解析消息:

filter 
  dissect 
    mapping =>  "message" => "%ts %+ts %+ts %src %prog[%pid]: %msg" 
  

解剖过滤器应用后,事件将被解剖到以下领域:


  "msg"        => "Starting system activity accounting tool...",
  "@timestamp" => 2017-04-26T19:33:39.257Z,
  "src"        => "localhost",
  "@version"   => "1",
  "host"       => "localhost.localdomain",
  "pid"        => "1",
  "message"    => "Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool...",
  "type"       => "stdin",
  "prog"       => "systemd",
  "ts"         => "Apr 26 12:20:02"

说明:

Apr 26 12:20:02
%ts %+ts %+ts     #+代表该匹配值追加到ts字段下

    "ts":"Apr 26 12:20:02"


two three one go
%+order/2 %+order/3 %+order/1 %+order/4     #/后面的数字代表拼接的次序

    "order": "one two three go"


a=1&b=2
%?key1=%&key1&%?key2=%&key2  #%?代表忽略匹配值,但是富裕字段名,用于后续匹配用;%&代表将匹配值赋予key1的匹配值

    "a":"1",
    "b":"2"


#dissect可以自动处理空的匹配值
John Smith,Big Oaks,Wood Lane,Hambledown,Canterbury,CB34RY
%name,%addr1,%addr2,%addr3,%city,%zip

Jane Doe,4321 Fifth Avenue,,,New York,87432

    "name":"Jane Doe",
    "addr1":"4321 Fifth Avenue",
    "addr2":"",
    "addr3":"",
    "city":"New York",
    "zip":"87432"


#dissect分割后的字段值都是字符串,可以使用convert_datatype属性进行类型转换
filter
    dissect
        convert_datatype => age => "int"
    

mutate 插件

使用最频繁的操作,可以对字段进行各种操作,比如重命名、删除、替换、更新等,主要操作如下:

convert   #类型转换
gsub      #字符串替换
split/join/merge    #字符串切割、数组合并为字符串、数组合并为数组
rename    #字段重命名
update/replace   #字段内容更新或替换
remove_field     #删除字段

convert:实现字段类型的转换,类型为hash,仅支持转换为integer、float、stringBoolean

filter
    mutate
        convert => "age" => "integer"
    

gsub:对字段内容进行替换,类型为数组,每3项为一个替换配置

filter 
  mutate 
    gsub => [
      # replace all forward slashes with underscore
      "fieldname", "/", "_",
      # replace backslashes, question marks, hashes, and minuses
      # with a dot "."
      "fieldname2", "[\?#-]", "."
    ]
  
       

split:将字符串切割为数组

filter 
  mutate 
     split =>  "fieldname" => "," 
  
   

join:将数组拼接为字符串
merge:将两个数组合并为1个数组,字符串会被转为1个元素的数组进行操作
rename:字段重命名
update/replace:更新字段内容,区别在于update只在字段存在时生效,而replace在字段不存在时会执行新增字段的操作

filter 
  mutate 
    update =>  "sample" => "My new message" 
    update =>  "message" => "source from c:%source_host"    #%source_host可以引用logstash Event中的字段值
  
       
input 
        stdintype=>stdin

filter
        dissect mapping => "message" => "%a-%b-%c" 
        mutate replace => "d" =>"source from c:%c" 

output
        stdoutcodec=>rubydebug


hi-hello-123

             "a" => "hi",
             "b" => "hello",
    "@timestamp" => 2018-06-29T02:01:24.473Z,
             "c" => "123",
             "d" => "source from c:123",
      "@version" => "1",
          "host" => "Node2",
       "message" => "hi-hello-123",
          "type" => "stdin"

json 插件

将字段内容为json格式的数据进行解析

filter 
  json 
    source => "message"     #要解析的字段名
    target => "msg_json"    #解析后的存储字段,默认和message同级别
  
   

geoip 插件

常用的插件,根据ip地址提供对应的地域信息,比如经纬度、城市名等,方便进行地理数据分析

filter 
  geoip 
    source => "clientip"
  

ruby 插件

最灵活的插件,可以以ruby语言来随心所欲的修改Logstash Event对象

filter
    ruby
        code => ‘size = event.get("message").size;
                event.set("message_size",size)‘
    


ruby 
        code => "event.set(‘@read_timestamp‘,event.get(‘@timestamp‘))"

详细介绍请查看官方文档

如何使用logstash(代码片段)

目录一、什么是Logstash二、如何安装三、快速使用四、Input输入插件五、codec编码插件六、filter过滤器插件七、output输出插件八、总结一、什么是LogstashLogstash是一个日志收集器,可以理解为一个管道,或者中间件。功能是从定义... 查看详情

logstash语法常用案例解析

摘要此篇主要讲Filter插件,已经对nginx日志的各种处理实例接着上篇继续说插件1,Filter插件Grok:正则捕获Date:时间处理Mutate:数据修改Geoip:查询归类JSON:编解码Grok:解析和结构化任何文本。http://grokdebug.herokuapp.com/patterns# ... 查看详情

elk之logstash(代码片段)

1、logstash简介?logstash是一个数据分析软件,主要目的是分析log日志。整一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是view层。首先将数据传给logstash,它将数据进行过滤和格式化(转成JSON格... 查看详情

logstash:处理多个input(代码片段)

Logstash:处理多个inputLogstash的整个pipleline分为三个部分:input插件:提取数据。这可以来自日志文件,TCP或UDP侦听器,若干协议特定插件(如syslog或IRC)之一,甚至是排队系统(如Redis,AQMP或Kafka)。此阶段使用围绕事件来源的... 查看详情

logstash:处理多个input(代码片段)

我们知道Logstash的架构如下: 它的整个pipleline分为三个部分:   input插件:提取数据。这可以来自日志文件,TCP或UDP侦听器,若干协议特定插件(如syslog或IRC)之一,甚至是排队系统(如Redis,AQMP或Kafka)。此阶段... 查看详情

elk之logstash配置文件详解(代码片段)

  Logstash是一个开源的数据收集引擎,它具有备实时数据传输能力。它可以统一过滤来自不同源的数据,并按照开发者的制定的规范输出到目的地。它以插件的形式来组织功能,通过配置文件来描述需要插件做什么,配置文件... 查看详情

记录logstash的filter使用(代码片段)

概述logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的过滤器提供的并不单单是过滤的功能,还可以对进入过滤器的原始数据进行复杂的逻辑处理,甚至添加独特的新事件到后续流程中 强大的文本解析工具&nbs... 查看详情

fluentd插件rewrite-tag-filter介绍(代码片段)

安装方法:geminstallfluent-plugin-rewrite-tag-filter详细文档:https://github.com/fluent/fluent-plugin-rewrite-tag-filter######具体用法https://docs.fluentd.org/v1.0/articles/out_rewrite_tag_filter######官方文档tag是什么?在f 查看详情

企业运维之elk日志分析平台(logstash)(代码片段)

ELK日志分析平台--Logstash数据采集介绍与配置1.Logstash简介2.Logstash组成3.Logstash安装与配置3.1运行logstash3.2file输出插件3.3elasticsearch输出插件3.4Syslog输入插件3.5多行过滤插件3.6grok过滤插件1.Logstash简介Logstash是用于日志的搜集、分析、... 查看详情

logstash安装介绍

前言logstash是ELK日志系统中的一部分,主要承担将收集完成日志进行过滤,并且输出到es的职责。logstash本身也可以作为客户端部署到应用系统的服务器上进行日志收集,但是由于资源开销占用过大,所以客户端的收集工作交给了... 查看详情

使用logstashfiltergrok过滤日志文件(代码片段)

Logstash提供了一系列filter过滤plugin来处理收集到的logevent,根据logevent的特征去切分所需要的字段,方便kibana做visualize和dashboard的dataanalysis。所有logstash支持的event切分插件查看这里。下面我们主要讲grok切分。Grok基本介绍Grok使用... 查看详情

logstash数据处理服务的输出插件output配置参数详解(代码片段)

Logstash数据处理服务的输出插件Output配置参数详解1.将日志数据存储到Elasticsearch集群output配置字段是将收集的日志数据存输出到生存储中,一般都是elasticsearch集群。常用字段配置:hostsES集群每个节点的地址信息。index:指定存储... 查看详情

ansible如何使用filter插件转换数据(代码片段)

...伴分享一些Ansible中过滤器博文内容比较简单主要介绍的常用过滤器和对应的Demo使用过滤器如何处理变量理解不足小伙伴帮忙指正食用方式:了解Ansible基础语法傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心... 查看详情

ansible如何使用filter插件转换数据(代码片段)

...伴分享一些Ansible中过滤器博文内容比较简单主要介绍的常用过滤器和对应的Demo使用过滤器如何处理变量理解不足小伙伴帮忙指正食用方式:了解Ansible基础语法傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心... 查看详情

logstash配置文件详解(代码片段)

 logstashpipeline包含两个必须的元素:input和output,和一个可选元素:filter。 从input读取事件源,(经过filter解析和处理之后),从output输出到目标存储库(elasticsearch或其他)。 在生产环境使用logstash,一般使用都将配... 查看详情

gulp介绍及常用插件使用方法(代码片段)

...让我们可以专注于代码,提高工作效率。一、API介绍gulp常用的API只有四个:gulp.task(),gulp.src(),gulp.dest(),gulp.watch() 1.gulp.src()输出(Emits)符合所提供的匹配模式(glob)或者匹配模式 查看详情

gradle学习之插件介绍(代码片段)

...,都是以插件的形式进行扩展Gradle本身就内置了很多常用插件,可以满足我们大部分的需求,但是也有一些常用的插件没有内置 查看详情

logstash(代码片段)

1.概述  logstash是一个日志转化系统,用户通过定义一个input,filter,和一个output配置来完成日志的收集和存储工作。2.数据类型  booldebug=>truebytes  my_bytes=>"113"#113bytes  stringhost=>"hostname"  numberport=>214  arrayma... 查看详情