logstash grok使用案例

简介:

Grok 是 Logstash 最重要的插件。你可以在 grok 里预定义好命名正则表达式,在稍后(grok参数或者其他正则表达式里)引用它。它非常适用于syslog logs,apache和一些其他的webserver logs,以及mysql logs。grok有很多定义好pattern,当然也可以自己定义。

grok的语法:

%{SYNTAX:SEMANTIC}

SYNTAX表示grok定义好的pattern,SEMANTIC表示自定义的字段。

例如192.168.0.100

%{IP:client}可以将IP定义为client


假如现在某webserver log中的内容为以下格式,

1
55.3.244.1 GET  /index .html 15824 0.043

我们完全可以利用grok将这些信息定义成以下字段

%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

写到配置文件中通常这样子:

input {  file {    path => "/var/log/http.log"  }}filter {  grok {    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }  }}


grok过滤后得到的信息成了以下这样子

  • client: 55.3.244.1

  • method: GET

  • request: /index.html

  • bytes: 15824

  • duration: 0.043

如何自定义Pattern?

语法:(?<field_name>the pattern here)

假如有以下内容“

begin 123.456 end

我们希望将123.456定义成request_time字段,可以向下面这样写这个正则表达式

\s+(?<request_time>\d+(?:\.\d+)?)\s+

解释:

\s:匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。+表示匹配次数为1次或者多次

(?<request_time>  ):这个是grok语法,request_time表示要将捕获的字符定义成的字段名

\d+:匹配一个或者多个数字

(?:\.\d+):为正则表达式,

(?: pattern):非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式

\.\d+:表示点后面跟一个或者多个 数字,(?:\.\d+)?表示点后面跟一个或多个数字这种情况出现0次或者多次,如果为0次,则request_time为一个整数。所以匹配到的结果可能为123.456或者123或者123.4.5.6,这些都满足条件


测试下:

创建一个配置文件,内容如下:

input {stdin{}}
filter {
    grok {
        match => {
            "message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"
        }
    }
}
output {stdout{}}

运行 logstash 进程然后输入 "begin 123.456 end",你会看到类似下面这样的输出:

{
         "message" => "begin 123.456 end",
        "@version" => "1",
      "@timestamp" => "2014-08-09T11:55:38.186Z",
            "host" => "raochenlindeMacBook-Air.local",
    "request_time" => "123.456"
}

练习:

1
2
3
4
5
6
/var/log/userlog .info 日志文件中获取到的信息为以下格式,需要自定义
 
2016-05-20T20:00:15.703407+08:00 localhost [audit root /13283  as root /13283  on pts /0/172 .16.100.99:64790->10.10.10.6:22]:  #=== session closed ===
2016-05-21T09:52:54.424055+08:00 localhost [audit root /13558  as root /13558  on pts /0/172 .16.100.99:50897->10.10.10.6:22]:  #=== session opened ===
2016-05-21T09:53:25.687134+08:00 localhost [audit root /13558  as root /13558  on pts /0/172 .16.100.99:50897->10.10.10.6:22]  /root cd  /etc/logstash/conf .d/
2016-05-21T09:53:26.284741+08:00 localhost [audit root /13558  as root /13558  on pts /0/172 .16.100.99:50897->10.10.10.6:22]  /etc/logstash/conf .d: ll

注意上面的日志文件中不是每一行的内容格式都是一样的,grok表达式如下

1
%{TIMESTAMP_ISO8601:timestamp} %{IPORHOST:login_host} \[\S+ %{USER:login_user}/%{NUMBER:pid} as %{USER:sudouser}/%{NUMBER:sudouser_pid} on %{WORD: tty }/%{NUMBER:tty_id}/%{IPORHOST:host_ip}:%{NUMBER:source_port}-\>%{IPORHOST:local_ip}:%{NUMBER:dest_port}\](?:\:|) (%{UNIXPATH:current_path} %{GREEDYDATA: command }|%{GREEDYDATA:detail})
1
注意:(?:\:|) (%{UNIXPATH:current_path} %{GREEDYDATA: command }|%{GREEDYDATA:detail})

上面的日志内容在后面出现了不一样的地方

wKiom1dEMIWz2jEjAAC79PwvZH0750.png

该如何处理?冒号可能有也可能没有,必须对冒号进行匹配,正则表达式如下

1
(?:\:|)   还可以这样写 (\:)?  表示冒号出现一次或者多次

当没有冒号,后面的信息是以下内容时,

1
/root cd  /etc/logstash/conf .d/

grok这样写,

1
%{UNIXPATH:current_path} %{GREEDYDATA: command }

当出现

1
#=== session closed ===

这样的内容时,grok这样写,

1
%{GREEDYDATA:detail}

但是这两种情况需要加“|”来判断,表示或,所以正确的写法为

1
(%{UNIXPATH:current_path} %{GREEDYDATA: command }|%{GREEDYDATA:detail})

注意如果上面的grok语句顺序调整为下面这样子时

1
(%{GREEDYDATA:detail}|%{UNIXPATH:current_path} %{GREEDYDATA: command })

就会有问题,它会将

1
/root cd  /etc/logstash/conf .d/

全部匹配成detail。










本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1782637,如需转载请自行联系原作者
目录
相关文章
Logstash 配置 Grok 语法
Logstash 配置 Grok 语法
426 0
Logstash 配置 Grok 语法
|
数据可视化 Java Linux
ElasticSerach学习(五)-基于ES+filebeat+logstash实现日志收集系统
ElasticSerach学习(五)-基于ES+filebeat+logstash实现日志收集系统
761 0
|
12天前
|
弹性计算 运维 监控
【最佳实践】iLogtail使用Grok语法解析日志
目标读者数字化系统开发运维(DevOps)工程师、稳定性工程师(SRE)、可观测平台运维人员等。背景介绍日志的形式往往多种多样,如果只是简单的读入日志数据,将很难进行搜索、分析及可视化。将原始的日志数据解析为结构化的数据,将大幅提升数据的可用性,方便用户进行快捷的“字段-值”的查询和分析。最基础的解...
【最佳实践】iLogtail使用Grok语法解析日志
|
存储 数据处理 iOS开发
干货 | Logstash自定义正则表达式ETL实战
本文建立在干货 | Logstash Grok数据结构化ETL实战上,并专注于在Grok中使用自定义正则表达式。 有时Logstash没有我们需要的模式。 幸运的是,我们有正则表达式库:Oniguruma。 Oniguruma是一个灵活的正则表达式库。 它包含多种语言的不同正则表达式实现的特性。 Github地址:https://github.com/kkos/oniguruma
671 0
干货 | Logstash自定义正则表达式ETL实战
|
编解码
collectd 与 logstash配置
节点 node1: 配置logstash node2: 配置collectd, collectd收集本地的信息, 通过配置将信息发送到node1节点 node1安装配置logstash rpm -ivh logstash.
1206 0
|
编解码 监控 NoSQL
Logstash 讲解与实战应用
原文网址:http://blog.51cto.com/tchuairen/1840596 一、Logstash 介绍 Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理。
889 0