关闭

Logstash:从grok到5.X版本的dissect

标签: logstashdissectgrokelk
2725人阅读 评论(0) 收藏 举报
分类:


这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer


写在前边的话

grok 作为 Logstash 最广为人知的插件,在性能和资源损耗方面同样也广为诟病。为了应对这个情况,同时也考虑到大多数时候,日志格式并没有那么复杂,Logstash 开发团队在 5.0 版新添加了另一个解析字段的插件:dissect。当日志格式有比较简明的分隔标志位,而且重复性较大的时候,我们可以使用 dissect 插件更快的完成解析工作。


安装和example

安装

使用之前首先检查自己的logstash plugin中是否包含,如果未包含,请先安装
检查所有插件

/your/logstash/path/bin/logstash-plugin list

安装logstash-filter-dissect

/your/logstash/path/bin/logstash-plugin install logstash-filter-dissect

example

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

语法解释:

我们看到上面使用了和 Grok 很类似的 %{} 语法来表示字段,这显然是基于习惯延续的考虑。不过示例中 %{+ts} 的加号就不一般了。dissect 除了字段外面的字符串定位功能以外,还通过几个特殊符号来处理字段提取的规则:
● %{+key} 这个 + 表示,前面已经捕获到一个 key 字段了,而这次捕获的内容,自动添补到之前 key 字段内容的后面。
● %{+key/2} 这个 /2 表示,在有多次捕获内容都填到 key 字段里的时候,拼接字符串的顺序谁前谁后。/2 表示排第 2 位。
● %{?string} 这个 ? 表示,这块只是一个占位,并不会实际生成捕获字段存到 Event 里面。
● %{?string} %{&string} 当同样捕获名称都是 string,但是一个 ? 一个 & 的时候,表示这是一个键值对。

比如对 http://rizhiyi.com/index.do?id=123 写这么一段配置:

http://%{domain}/%{?url}?%{?arg1}=%{&arg1}

则最终生成的 Event 内容是这样的:

{
  domain => "rizhiyi.com",
  id => "123"
}

该插件的一些配置

该插件支持下边这几种配置,所有的配置都包括在 dissect{ }中。

Setting Input Type Required Default Value
add_field hash No {}
add_tag array No []
convert_datatype hash No {}
enable_metric boolean No true
id string No
mapping hash No {}
periodic_flush boolean No false
remove_field array No []
remove_tag array No []
tag_on_failure arrray No [“_dissectfailure”]

1:add_field

如果此过滤器解析成功,便可以为该事件添加任何字段,字段名称可以是动态的,并使用%{field}包括事件部分
eg:

input{
  stdin{
    type => "dissect"

  }
}
filter {
  dissect {
    add_field => {
      "from_%{host}" => "Hello world, now is %{@timestamp}"
      "new_field" => "new_static_value"
    }
  }
}
output{
  stdout{
    codec => rubydebug
  }
  elasticsearch{
    hosts => ["http://localhost:9200"]
    index => "logstash-%{type}"
  }
}

执行

sudo /usr/share/logstash/bin/logstash -f test.conf

输入hello test
显示:

17:08:26.925 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
hello test
{
         "@timestamp" => 2017-03-28T09:08:29.814Z,
          "new_field" => "new_static_value",
           "@version" => "1",
               "host" => "thinkgamer",
            "message" => "hello test",
               "type" => "dissect",
    "from_thinkgamer" => "Hello world, now is 2017-03-28T09:08:29.814Z"
}

所以说这里的%{somefield} 就是已经存在的字段名称

2:add_tag

替换上边程序的filter为:

filter {
  dissect {
    add_tag => ["foo_%{host}","taggedy_tag" ]
  }
}

运行输入 hello test
显示:

17:12:42.307 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
hello test
{
    "@timestamp" => 2017-03-28T09:13:05.728Z,
      "@version" => "1",
          "host" => "thinkgamer",
       "message" => "hello test",
          "type" => "dissect",
          "tags" => [
        [0] "foo_thinkgamer",
        [1] "taggedy_tag"
    ]
}

3:convert_datatype

使用此设置,可以指定int和float数据类型转换,如果在elasticsearch中没有使用mapping的话,这将是很有用的

filter {
  dissect {
    convert_datatype{
      cpu => "float"
      code => "int"
    }
  }
}

4:enable_metric

默认情况下我们可以记录所有的指标,但是你可以通过该项配置来禁止或者启动是否记录这些指标

5:id

向插件实例添加唯一ID,此ID用于跟踪插件特定配置的信息。

6:mapping

field=>value 可以对当前解析的值进行以后的解析
eg:

filter {
  dissect {
    mapping => {
      "message" => "%{field1} %{field2} %{description}"
      "description" => "%{field3} %{field4} %{field5}"
    }
  }
}

7:periodic_flush

定期调用过滤器刷新方法,可选

8:remove_field

eg:

filter {
  dissect {
    add_field => {
      "from_%{host}" => "Hello world, now is %{@timestamp}"
      "new_field" => "new_static_value"
    }
    remove_field => ["from_%{host}"]
  }
}

输入hello test
显示:

18:04:09.028 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
hello test
{
    "@timestamp" => 2017-03-28T10:04:36.910Z,
     "new_field" => "new_static_value",
      "@version" => "1",
          "host" => "thinkgamer",
       "message" => "hello test",
          "type" => "dissect"
}

9:remove_tag

删除标签,可以是动态的
eg:

filter {
  dissect {
    add_tag => ["foo_%{host}","taggedy_tag" ]
    remove_tag => ["foo_%{host}"]
  }
}

输入hello test
显示:

18:06:10.097 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
hello test
{
    "@timestamp" => 2017-03-28T10:06:35.259Z,
      "@version" => "1",
          "host" => "thinkgamer",
       "message" => "hello test",
          "type" => "dissect",
          "tags" => [
        [0] "taggedy_tag"
    ]
}

10:tag_on_failure

当解析失败时,将值附加到标签字段


Over !

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Logstash5.X 日志搜集处理框架 安装配置

0. 介绍Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。 http://kibana.l...
  • wljk506
  • wljk506
  • 2017-02-22 09:01
  • 5154

ELK中logstash下的grok正则表达式总结

首先,我的web项目打印的日志是这样的: 2016-11-30 11:10:44,568 INFO [org.springframework.web.servlet.DispatcherServlet...
  • shunzi1046
  • shunzi1046
  • 2016-12-01 15:35
  • 5013

关于Logstash中grok插件的正则表达式例子

http://www.cnblogs.com/stozen/p/5638369.html 一、前言 近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK...
  • liukuan73
  • liukuan73
  • 2016-08-25 20:53
  • 8327

logstash-filter-grok-3.4.3

  • 2017-12-15 10:24
  • 20KB
  • 下载

Logstash使用grok解析IIS日志

Logstash使用grok解析IIS日志 1. 安装配置 安装Logstash前请确认Elasticsearch已经安装正确,参见RedHat6.4安装Elasticsearch5.2.0。 ...
  • mvpboss1004
  • mvpboss1004
  • 2017-02-10 00:15
  • 4136

logstash,nginx日志,grok pattern调试

#Nginx日志格式定义 log_format combine '$remote_addr - $remote_user [$time_local] "$request" $h...
  • codeiswhat
  • codeiswhat
  • 2016-06-16 14:59
  • 854

Logstash 常用正则(grok-patterns)

USERNAME [a-zA-Z0-9._-]+ USER %{USERNAME} INT (?:[+-]?(?:[0-9]+)) BASE10NUM (?[+-]?(?:(?:[0-9]+(?:\....
  • xunzaosiyecao
  • xunzaosiyecao
  • 2017-03-28 20:03
  • 816

logstash+grok+json+elasticsearch解析复杂日志数据(二)

接着上面一篇来说,这篇主要介绍logstash处理实时数据问题,日志数据更新时,logstash处理方式是默认每15s检查一次文件夹,每5秒检查一次文件,这些参数可以改变的。遇到当处理较多批次数据时,...
  • u014297722
  • u014297722
  • 2016-10-19 19:48
  • 3582

logstash(三):过滤器与grok

在logstash中,配置完输入数据流后,接下来就是对数据进行解析,最简单的方法莫过于使用过滤器(filter)与grok的组合。在grok中,支持以正则表达式的方式提取所需要的信息,其中,正则表达式...
  • yiifaa
  • yiifaa
  • 2017-08-08 17:50
  • 584

ELK中logstash下的grok正则表达式总结

首先,我的web项目打印的日志是这样的: 2016-11-30 11:10:44,568 INFO [org.springframework.web.servlet.DispatcherServ...
  • sfdst
  • sfdst
  • 2017-04-11 10:53
  • 613
    Thinkgamer微博
    微信公众号【数据与算法联盟】

    扫码关注公众号,获取小编微信拉你进数据算法大佬群!
    个人资料
    • 访问:994163次
    • 积分:11214
    • 等级:
    • 排名:第1630名
    • 原创:221篇
    • 转载:22篇
    • 译文:2篇
    • 评论:331条
    个人简介
    姓名:Thinkgamer

    Github:https://github.com/thinkgamer

    主攻:云计算/python/数据分析

    程度:熟悉/熟悉/熟悉

    微信:gyt13342445911

    Email:thinkgamer@163.com

    工作状态:在职ing

    心灵鸡汤:只要努力,你就是下一个大牛...

    hadoop/spark/机器学习群:279807394(大神建的群,蹭个管理员)

    欢迎骚扰........
    博客专栏
    最新评论