一、前言

近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属。

Logstash负责采集日志,Elasticsearch负责存储、索引日志,Kibana则负责通过Web形式展现日志。

今天,我要说的是Logstash,它可以从多种渠道采集数据,包括控制台标准输入、日志文件、队列等等,只要你能想到,都可以通过插件的方式实现。

其中,日志源提供的日志格式可能并不是我们想要插入存储介质里的格式,所以,Logstash里提供了一系列的filter来让我们转换日志

Grok就是这些filters里最重要的一个插件,下面我就说说它。

二、Grok提供的常用Patterns说明及举例

大多数Linux使用人员都有过用正则表达式来查询机器中相关文件或文件里内容的经历,在Grok里,我们也是使用正则表达式来识别日志里的相关数据块。

有两种方式来使用正则表达式:

  1. 直接写正则来匹配
  2. 用Grok表达式映射正则来匹配

在我看来,每次重新写正则是一件很痛苦的事情,为什么不用表达式来一劳永逸呢?

特别提示:Grok表达式很像C语言里的宏定义

要学习Grok的默认表达式,我们就要找到它的具体配置路径,路径如下:

# Windows下路径
[你的logstash安装路径]\vendor\bundle\jruby\x.x\gems\logstash-patterns-core-x.x.x\patterns\grok-patterns

现在对常用的表达式进行说明:

常用表达式

  • USERNAME 或 USER

    用户名,由数字、大小写及特殊字符(._-)组成的字符串

比如:1234BobAlex.Wong

  • EMAILLOCALPART

    电子邮件用户名部分,首位由大小写字母组成,其他位由数字、大小写及特殊字符(_.+-=:)组成的字符串。注意,国内的QQ纯数字邮箱账号是无法匹配的,需要修改正则

比如:stoneGary_Luabc-123

  • EMAILADDRESS

    电子邮件

比如:stone@abc.comGary_Lu@gmail.comabc-123@163.com

  • HTTPDUSER

    Apache服务器的用户,可以是EMAILADDRESSUSERNAME
  • INT

    整数,包括0和正负整数

比如:0-12343987

  • BASE10NUM 或 NUMBER

    十进制数字,包括整数和小数

比如:0185.23

  • BASE16NUM

    十六进制数字,整数

比如:0x0045fa2d-0x3F8709

  • BASE16FLOAT

    十六进制数字,整数和小数
  • WORD

    字符串,包括数字和大小写字母

比如:String3529345ILoveYou

  • NOTSPACE

    不带任何空格的字符串
  • SPACE

    空格字符串
  • QUOTEDSTRING 或 QS

    带引号的字符串

比如:"This is an apple"'What is your name?'

  • UUID

    标准UUID

比如:550E8400-E29B-11D4-A716-446655440000

  • MAC

    MAC地址,可以是Cisco设备里的MAC地址,也可以是通用或者Windows系统的MAC地址
  • IP

    IP地址,IPv4或IPv6地址

比如:127.0.0.1FE80:0000:0000:0000:AAAA:0000:00C2:0002

  • HOSTNAME

    主机名称
  • IPORHOST

    IP或者主机名称
  • HOSTPORT

    主机名(IP)+端口

比如:127.0.0.1:3306api.stozen.net:8000

  • PATH

    路径,Unix系统或者Windows系统里的路径格式

比如:/usr/local/nginx/sbin/nginxc:\windows\system32\clr.exe

  • URIPROTO

    URI协议

比如:httpftp

  • URIHOST

    URI主机

比如:www.stozen.net10.0.0.1:22

  • URIPATH

    URI路径

比如://www.stozen.net/abc//api.php

  • URIPARAM

    URI里的GET参数

比如:?a=1&b=2&c=3

  • URIPATHPARAM

    URI路径+GET参数

比如://www.stozen.net/abc/api.php?a=1&b=2&c=3

  • URI

    完整的URI

比如:http://www.stozen.net/abc/api.php?a=1&b=2&c=3

日期时间表达式

  • MONTH

    月份名称

比如:JanJanuary

  • MONTHNUM

    月份数字

比如:03912

  • MONTHDAY

    日期数字

比如:03931

  • DAY

    星期几名称

比如:MonMonday

  • YEAR

    年份数字
  • HOUR

    小时数字
  • MINUTE

    分钟数字
  • SECOND

    秒数字
  • TIME

    时间

比如:00:01:23

  • DATE_US

    美国日期格式

比如:10-15-198210/15/1982

  • DATE_EU

    欧洲日期格式

比如:15-10-198215/10/198215.10.1982

  • ISO8601_TIMEZONE

    ISO8601时间格式

比如:+10:23-1023

  • TIMESTAMP_ISO8601

    ISO8601时间戳格式

比如:2016-07-03T00:34:06+08:00

  • DATE

    日期,美国日期%{DATE_US}或者欧洲日期%{DATE_EU}
  • DATESTAMP

    完整日期+时间

比如:07-03-2016 00:34:06

  • HTTPDATE

    http默认日期格式

比如:03/Jul/2016:00:36:53 +0800

Log表达式

  • LOGLEVEL

    日志等级

比如:AlertalertALERTError

三、创建自己的Grok表达式

在业务领域中,可能会有越来越多的日志格式出现在我们眼前,而Grok的默认表达式显然已无法满足我们的需求(比如用户身份证号、手机号等信息),所以,我们需要自己动手添加些表达式。

表达式 正则表达式 说明
DATE_CHS %{YEAR}[./-]%{MONTHNUM}[./-]%{MONTHDAY} 中国人习惯的日期格式
ZIPCODE_CHS [1-9]\d{5} 国内邮政编码
GAME_ACCOUNT [a-zA-Z][a-zA-Z0-9_]{4,15} 游戏账号,首字符为字母,4-15位字母、数字、下划线组成

还有很多,需要您在业务中灵活运用!

关于Logstash中grok插件的正则表达式例子的更多相关文章

  1. 使用logstash的grok插件解析springboot日志

    使用logstash的grok插件解析springboot日志 一.背景 二.解决思路 三.前置知识 四.实现步骤 1.准备测试数据 2.编写`grok`表达式 3.编写 logstash pipel ...

  2. Logstash使用grok插件解析Nginx日志

    grok表达式的打印复制格式的完整语法是下面这样的: %{PATTERN_NAME:capture_name:data_type}data_type 目前只支持两个值:int 和 float. 在线g ...

  3. logstash 中multiline插件的用法

    input { stdin { codec =>multiline { charset=>... #可选 字符编码 max_bytes=>... #可选 bytes类型 设置最大的字 ...

  4. Logstash的grok以及Ruby

    logstash的grok插件的用途是提取字段,将非格式的内容进行格式化, input { file { path => "/var/log/http.log" } } fi ...

  5. Logstash详解之——filter模块-grok插件

    1. grok插件:能匹配一切数据,但是性能和对资源的损耗也很大. grok内置字段类型参见: https://blog.csdn.net/cui929434/article/details/9439 ...

  6. logstash -grok插件语法介绍

      介绍 logstash拥有丰富的filter插件,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!Grok 是 Logsta ...

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

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

  8. logstash中的redis插件

    redis作为logstash中的官方broker,既有input插件,还有output插件. redis input插件 data_type属性: 有三种类型, list -> BLPOP - ...

  9. logstash之Filter插件

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

随机推荐

  1. HDU 2655 主席树

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. sleep方法和wait方法的区别?

    sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复.调用sleep 不会释放对象锁.wait 是Object 类的方法 ...

  3. iframe的使用及操作

    一.iframe的使用方法: 在一个页面中加入iframe代码,例如: <div class="myiframe"> <iframe src="test ...

  4. 洛谷 P2800 又上锁妖塔

    https://www.luogu.org/problem/show?pid=2800 题目背景 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩& ...

  5. 【NOIP】提高组2016 蚯蚓

    [题目链接]Universal Online Judge [题解]本题最大的特点在于从大到小切以及切分规则一致,都是切成px和x-px. 由这两个特点很容易得到结论,后切的蚯蚓得到的px一定比先切的蚯 ...

  6. 超详细的Java面试题总结(一)之Java基础知识篇

    面向对象和面向过程的区别 面向过程:   优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因 ...

  7. 【CC2530入门教程-01】CC2530微控制器开发入门基础

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:[1]CC2530微控制器开发入门基础.[2]通用I/O端口的输入和输出.[3]外部中断初步应用. ...

  8. HDU 2899 三分

    我们对这个函数求二阶导数,发现他的二阶导数是恒大于0的,那么他的导数是单调的,且在某时刻为0,那么这时的x值就是极值处的x值,其实题目说了,有最小值,那么我们三分水过去就好了. 反思:精度不够,因为是 ...

  9. css优先级机制

    所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.   1.important >(内联样式)Inline style  >(内部样式)Internal style sheet ...

  10. SpringCloud Fegin超时重试源码

    springCloud中最重要的就是微服务之间的调用,因为网络延迟或者调用超时会直接导致程序异常,因此超时的配置及处理就至关重要. 在开发过程中被调用的微服务打断点发现会又多次重试的情况,测试环境有的 ...