本文简单介绍一下 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. 【Vue.js】加载更多—vue-infinite-scroll

    引言 今天用到了一个加载更多的插件,用起来很方便,插件的名字叫做vue-infinite-scroll 我们可以去npmjs.com官网看一下这个vue-infinite-scroll的用法,官网上面 ...

  2. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(3)- 串口功能实现(pySerial)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之串口功能实现. 串口调试助手是最核心的当然是串口数据收发与显示的功能,Jays-PyCOM借助的是 ...

  3. Java面试系列--java基础

    Java基础总结 JAVA中的几种基本数据类型是什么,各自占用多少字节. 八大基本数据类型,byte:8位,short:16位,int:32位,long:64位,float:32位,double:64 ...

  4. List<T>常用操作函数

    1.Add():添加单个元素2.AddRange():添加一个集合4.Insert():插入一个元素5.InsertRange():插入一个集合6.Remove():移除指定的元素7.RemoveAt ...

  5. Captcha服务(后续2)— 改造Captcha服务之Asp.Net Core项目中如何集成TypeScript

    环境准备 .Net Core 版本:下载安装.Net Core SDK,安装完成之后查看sdk版本 ,查看命令dotnet --version,我的版本是2.2.101 IDE: Visual Stu ...

  6. c#连接oracle数据库底层方法

    using Oracle.ManagedDataAccess.Client;using System;using System.Collections;using System.Collections ...

  7. [Go] golang的接口合约

    接口类型1.接口类型具体描述了一系列方法的集合,实现这些方法的具体类型是这个接口类型的实例2.一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口 package main impor ...

  8. https处理的一个过程,对称加密和非对称加密

    一,对称加密 所谓对称加密,就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的过程如下: 发送端和接收端首先要共享相同的密钥k(即通信前双方都需要知道对应的密 ...

  9. js数组方法详解(最新最全)

    数组是js中最常用到的数据集合,其内置的方法有很多,熟练掌握这些方法,可以有效的提高我们的工作效率,同时对我们的代码质量也是有很大影响.本文所有的栗子都是在es7环境下测试的,如果有问题欢迎留言交流 ...

  10. MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点

    1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...