Logstash filter 插件之 grok
本文简单介绍一下 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的更多相关文章
- logstash实战filter插件之grok(收集apache日志)
有些日志(比如apache)不像nginx那样支持json可以使用grok插件 grok利用正则表达式就行匹配拆分 预定义的位置在 /opt/logstash/vendor/bundle/jruby/ ...
- Logstash filter 插件之 date
使用 date 插件解析字段中的日期,然后使用该日期或时间戳作为事件的 logstash 时间戳.对于排序事件和导入旧数据,日期过滤器尤其重要.如果您在事件中没有得到正确的日期,那么稍后搜索它们可能会 ...
- logstash过滤器插件filter详解及实例
1.logstash过滤器插件filter 1.1.grok正则捕获 grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结 ...
- ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例
1. Logstash输入插件 1.1 input介绍 logstash支持很多数据源,比如说file,http,jdbc,s3等等 图片上面只是一少部分.详情见网址:https://www.elas ...
- Logstash filter 的使用
原文地址:http://techlog.cn/article/list/10182917 概述 logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的 过滤器提供的并不单单是过滤的功能,还 ...
- logstash之Filter插件
Logstash之所以强悍的主要原因是filter插件:通过过滤器的各种组合可以得到我们想要的结构化数据 1:grok正则表达式 grok**正则表达式是logstash非常重要的一个环节**:可以通 ...
- logstash常用插件解析
官方地址:https://www.elastic.co/guide/en/logstash-versioned-plugins/current/index.html 配置文件写法: # 日志导入inp ...
- Logstash的插件
Logstash的插件: input插件: File:从指定的文件中读取事件流: 使用FileWatch(Ruby Gem库)监听文件的变化. .sincedb:记录了每个被监听的文件的inode, ...
- Logstash过滤插件
filter初级 Logstash安装 ### 设置YUM源 # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # t ...
随机推荐
- 禁止用户打开HTML页面调试
有些时候,我们可能想要禁止用户修改或者调试我们HTML页面的代码,这个时候需要组织用户打开调试窗口,下面介绍一些能够阻止用户在浏览器中打开调试窗口的方法,这些方法只能一定程度的提高打开调试的门槛,并不 ...
- 开源分布式数据库SequoiaDB在去哪儿网的实践
编者注: 中国的数据库行业也迎来了一波新的热点事件.分布式数据库这块新消息不断,也让大家开始关注中国的分布式数据库.首先是短短一周内,Pingcap和SequoiaDB巨杉数据库陆续宣布了C轮的数千万 ...
- MEF 基础简介 三
MEF导出类的方法和属性 首先来说导出属性,因为这个比较简单,和导出类差不多,先来看看代码,主要看我加注释的地方,MusicBook.cs中的代码如下: using System; using Sys ...
- [我还会回来的]asp.net core再战iris
废话不多说,直接开干! 硬件配置 处理器: Intel(R) Core(TM) i5-4690k CPU @3.90GHz 内存容量: 8.00 GB 软件版本 OS: Microsoft Windo ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
- windows安装elasticsearch
1. 去官网 https://www.elastic.co/cn/ 下载 注意: ES对JDK版本有较高的要求,5.x及以上版本需要JDK8支持,本人此次使用2.4.6版本2. 下载后,JDK先安装, ...
- 让Mongo在Spring中跑起来
本文标题为<让Mongo在Spring中跑起来>,旨在Spring中如何成功连接MongoDB并对其进行增删改查等操作,由于笔者也是刚接触,对其中的一些原由也不甚了解,若有错误之处,敬请指 ...
- 从淘宝和网易的font-size思考移动端怎样使用rem?
最近翻了一下关于移动端的rem的使用,怎样最方便.在读到流云诸葛的一篇关于<从网易与淘宝的font-size思考前端设计稿与工作流>的文章后,来总结一下. 然而根据我以往做移动端web项目 ...
- 【代码笔记】Web-CSS-CSS Display
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- C++语法小技巧
前言 写的很乱,各种内容都有.仅仅是为了记录一下 而且内容极其不严谨(没错,只有实践,没有理论)!请各位谨慎驾驶! 强制内联 #define Inline __inline__ __attribute ...