本文简单介绍一下 Logstash 的过滤插件 grok。

Grok 的主要功能

Grok 是 Logstash 最重要的插件。它可以解析任意文本并把它结构化。因此 Grok 是将非结构化的日志数据解析为可查询的结构化数据的好方法
这个工具非常适合 syslog 日志、apache 和其他 web 服务器日志、mysql 日志,以及那些通常为人(而不是计算机)编写的日志格式。

Grok 使用正则表达式提取日志记录中的数据,这也正是 grok 强大的原因。Grok 使用的正则表达式语法与 Perl 和 Ruby 语言中的正则表达式语法类似。你还可以在 grok 里预定义好命名正则表达式,并在稍后(grok 参数或者其他正则表达式里)引用它。

Grok 语法

语法格式:
%{SYNTAX:SEMANTIC}

SYNTAX 是文本匹配的正则表达式模式。比如 NUMBER 模式可以匹配到 3.15 之类的数字;IP 模式可以匹配到 192.168.0.1 等 IP 地址。
SEMANTIC 是为匹配的文本提供的标识符。比如,3.15 可以是事件的 duration(持续时间),因此可以简单地将其称为 duration;字符串 192.168.0.1 用来标识发出请求的 client。
因此和用下面的模式来结构化日志记录:
%{NUMBER:duration} %{IP:client}

其实上面的模式还不完善,%{NUMBER:duration} 匹配到的内容为字符串。如果你通过 duration 字段进行查询,比较的方式为字符串间的比较。我们可以在 duration 模式中添加数据类型转换的逻辑,将字符串更改为整数,只需要添加目标数据类型的后缀就可以了。例如 %{NUMBER:duration:float},它将 duration 语义从字符串转换为浮点数。目前支持的转换的类型只有 int 和 float。

我们可以通过 Grok Debugger 来学习和测试 grok 模式:

下面介绍一些常见的 demo

切出 path 中的特殊目录名称

笔者运维的一个系统中日志文件所在的目录以服务的名称命名,比如下面的 path:

/home/kr/work/sxs/logs/xxx.log

其中 sxs 为服务的名称,所有服务的日志都以该策略保存。所以可以通过 grok 轻松的从 path 中切出服务的名称:

grok {
match => {
"path" => "work/(?<service>%{WORD})/logs"
}
}

使用 grok debugger 测试的结果如下:

切出 http 请求的返回状态和响应时间

笔者系统中的日志记录中记录了 http 请求的返回状态和响应时间,其格式大致如下:

xxxxxxx <= [172.18.0.10] [GET /api/users/me] [] [103.055334 ms]

其中最后两个方括号中分别是返回状态和响应时间(单位毫秒)。可以使用下面的模式切出返回状态和响应时间:

grok {
match => {
"message" => "<= \[.*\] \[%{NUMBER:responsestatus}:int\] \[%{NUMBER:responsetime:float} ms\]"
}
}

上面的代码同时把切出的结果进行了类型转换。由于 grok debuger 不支持类型转换,所以使用下面的模式进行测试:

<= \[.*\] \[%{NUMBER:responsestatus}\] \[%{NUMBER:responsetime} ms\]

结果如下:

在 kibana 中,我们可以看到对应字段的类型显示为 number:

在 elasticsearch 中这两个字段的类型分别为 long 和 float:

"responsestatus": {
"type": "long"
},
"responsetime": {
"type": "float"
},

切分 nginx 日志

我们可以在 nginx 的配置文件中指定其日志的格式,比如下面的配置:

log_format  main  '[$time_local] [$remote_addr] [$request] [$http_user_agent] [$http_referer] [$status] [$request_time]';

使用下面的 grok 规则就能够正确切分出日志记录中的每一个字段:

grok {
match => {
"message" => "\[%{HTTPDATE:timestamp}\] \[%{IPV4:client}\] \[%{DATA:request}\] \[%{DATA:useragent}\] \[%{DATA:referer}\] \[%{NUMBER:responsestatus}\] \[%{NUMBER:responsetime}\]"
}
}

我们使用下面的一条日志记录在 Grok Debugger 中测试:

[/Mar/::: +] [52.187.2.193] ["GET /api/hc/mongo HTTP/1.1"] ["Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36"] ["-"] [] [0.050]

解析出的内容如下:

{
"timestamp": [
[
"26/Mar/2019:10:13:19 +0000"
]
],
"client": [
[
"52.187.2.193"
]
],
"request": [
[
""GET /api/hc/mongo HTTP/1.1""
]
],
"useragent": [
[
""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36""
]
],
"referer": [
[
""-""
]
],
"responsestatus": [
[
""
]
],
"responsetime": [
[
"0.050"
]
]
}

参考:
Grok filter plugin
Grok Debugger
《ELK Stack 权威指南》

Logstash filter 插件之 grok的更多相关文章

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

    有些日志(比如apache)不像nginx那样支持json可以使用grok插件 grok利用正则表达式就行匹配拆分 预定义的位置在 /opt/logstash/vendor/bundle/jruby/ ...

  2. Logstash filter 插件之 date

    使用 date 插件解析字段中的日期,然后使用该日期或时间戳作为事件的 logstash 时间戳.对于排序事件和导入旧数据,日期过滤器尤其重要.如果您在事件中没有得到正确的日期,那么稍后搜索它们可能会 ...

  3. logstash过滤器插件filter详解及实例

    1.logstash过滤器插件filter 1.1.grok正则捕获 grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结 ...

  4. ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例

    1. Logstash输入插件 1.1 input介绍 logstash支持很多数据源,比如说file,http,jdbc,s3等等 图片上面只是一少部分.详情见网址:https://www.elas ...

  5. Logstash filter 的使用

    原文地址:http://techlog.cn/article/list/10182917 概述 logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的 过滤器提供的并不单单是过滤的功能,还 ...

  6. logstash之Filter插件

    Logstash之所以强悍的主要原因是filter插件:通过过滤器的各种组合可以得到我们想要的结构化数据 1:grok正则表达式 grok**正则表达式是logstash非常重要的一个环节**:可以通 ...

  7. logstash常用插件解析

    官方地址:https://www.elastic.co/guide/en/logstash-versioned-plugins/current/index.html 配置文件写法: # 日志导入inp ...

  8. Logstash的插件

    Logstash的插件: input插件: File:从指定的文件中读取事件流: 使用FileWatch(Ruby Gem库)监听文件的变化. .sincedb:记录了每个被监听的文件的inode, ...

  9. Logstash过滤插件

    filter初级 Logstash安装 ### 设置YUM源 # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # t ...

随机推荐

  1. Spring中用了哪些设计模式

    1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...

  2. 【.Net Core】获取绝对路径、相对路径

    一.绝对路径 1.获取应用程序运行当前目录Directory.GetCurrentDirectory(). System.IO命名空间中存在Directory类,提供了获取应用程序运行当前目录的静态方 ...

  3. 如何保证MongoDB的安全性?

    上周写了个简短的新闻<MongoDB裸奔,2亿国人求职简历泄漏!>: 根据安全站点HackenProof的报告,由于MongoDB数据库没有采取任何安全保护措施,导致共计202,730,4 ...

  4. 转摘app-稳定性测试

    稳定性测试的概念有2种, 一, 稳定性测试,对应于异常性测试,即发生异常情况时,系统如何反应的测试.包含: 1 交互性测试,被打扰的情况,如来电,短信,低电量等.这些其实在上章的功能测试中有提到. 2 ...

  5. mssql sqlserver 快速表备份和表还原的方法

    摘要: 在sqlserver维护中,我们偶尔需要运行一些sql脚本对数据进行相关修改操作,在数据修改前我们必须对表数据进行备份来避免出现异常时,可以快速修复数据, 下文讲述sqlserver维护中,快 ...

  6. c/c++ 拷贝控制 右值与const引用

    拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...

  7. 【eclipse】mybatis配置文件创建与mapper接口文件创建

    什么是mybatis: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. mybatis配置文件: <?xml version="1.0" ...

  8. Linux常见系统故障

    Linux常见系统故障 1.修复MBR扇区故障 2.修复GRUB引导故障 3./etc/inittab文件丢失 4.遗忘root用户密码 5.修复文件系统 6.磁盘资源耗尽故障 一.修复MBR扇区故障 ...

  9. tomcat设置开机启动

    一.windows 1. 下载tomcat 2. 进入bin目录,查看是否存在service.dat,如果没有自行创建 3. 打开cmd,进入tomcat>bin目录 说明:用法: servic ...

  10. Java学习笔记记录(二)

    1.复合语句 if条件语句 使用场景:boolean类型判断.一个范围的判断.几个常量值的判断 有左大括号就没有分号,有分号就没有左大括号. 如下: public class demo1 { stat ...