Logstash 常用 filter 插件介绍(二)

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 {
        stdin{type=>stdin}
}
filter{
        dissect{ mapping => {"message" => "%{a}-%{b}-%{c}"} }
        mutate{ replace => {"d" =>"source from c:%{c}"} }
}
output{
        stdout{codec=>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‘))"
}

详细介绍请查看官方文档

原文地址:http://blog.51cto.com/wzlinux/2329811

时间: 2024-10-09 01:32:55

Logstash 常用 filter 插件介绍(二)的相关文章

学习笔记——Maven实战(七)常用Maven插件介绍(上)

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码. 用户可以通过两种方式调用Maven插

常用Maven插件介绍

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有 这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码. 用户可以通过两种方式调用Mav

Android support library支持包常用控件介绍(二)

谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现 Material Design设计效果,官方给出了Android support design library 支持库,让开发者更容易的实现材料设计的效果.顺便推荐官方的一个图标库:Material Icons 控件名称 NavigationView FloatingActionButton TextInputLayout Snackbar TabLayout AppBarLayout Coordinator

eclipse常用Eclipse插件介绍

以下是我整理的自己开发过程中的常用Eclipse插件: (1)     AmaterasUML         介绍:Eclipse的UML插件,支持UML活动图,class图,sequence图,usecase图等:支持与Java class/interface之间的相互导入导出.        官方网站:http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML         插件下载URL:http

Jmeter--Plugins Manager安装及常用的插件介绍

jmeter 客户端 内置的插件管理工具Plugins Manager 1.下载地址:https://jmeter-plugins.org/install/Install/ 2.将下载的文件拷贝的你的JMeter根目录下的\lib\ext 3.启动JMeter,点击 菜单栏 - 选项- Plugins Manager 常用的插件有: 用于服务器性能监视的-- PerfMon Metrics Collector用于建立压力变化模型的-- Stepping Thread Group用于Json解析的

logstash实战filter插件之grok(收集apache日志)

有些日志(比如apache)不像nginx那样支持json可以使用grok插件 grok利用正则表达式就行匹配拆分 预定义的位置在 /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns apache的在文件grok-patterns 查看官方文档 https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.ht

Sublime Text 3前端开发常用优秀插件介绍

Package Control插件管理 提到Sublime Text插件安装,就不得不提Package Control [官方文档] 简而言之,它是用来管理插件的插件 所以,首次使用前也是需要安装的 使用Ctrl+`(Esc键下方)快捷键或者通过View->Show Console菜单打开命令行 将以下代码复制后粘贴到如上图中"<代码粘贴处>",然后按Enter(回车),稍等片刻 import urllib.request,os,hashlib; h = '2915d

日志分析logstash插件介绍

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的.多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件. logstash功能很强大.从 logstash 1.5.0 版本开始,logstash 将所有的插件都独立拆分成 gem 包.这样,每个插件都可以独立更新,不用等待 logstash 自身做整体更新的时候才能使用了.为了达到这个目标,logstash 配置了专门的 plugins 管理命令 logstash插件安装(本地安装) logst

logstash常用插件解析

官方地址:https://www.elastic.co/guide/en/logstash-versioned-plugins/current/index.html 配置文件写法: # 日志导入input {}# 日志筛选匹配处理filter {}# 日志匹配输出output {} 日志解析配置文件的框架共分为三个模块,input,output,filter.后面会一一讲解, 每个模块里面存在不同的插件. input 模块 列子1 # file为常用文件插件,插件内选项很多,可根据需求自行判断i