如果没有日志解析,搜索和可视化日志几乎是不可能的,一个被低估的技能记录器需要读取他们的数据。 解析结构化你的传入(非结构化)日志,以便用户可以在调查期间或设置仪表板时搜索清晰的字段和值。

最流行的日志解析语言是 Grok。 你可以使用 Grok 插件在各种日志管理和分析工具比如 Elastic Stack 中解析日志数据。 在这里查看我之前的的 Grok 教程。

但是用 Grok 解析日志可能会很棘手。 本博客将研究一些 Grok 模式示例,这些示例可以帮助您了解如何解析日志数据。

开始使用 Grok

让我们从一个示例非结构化日志消息开始,然后我们将使用 Grok 模式对其进行结构化:

128.39.24.23 - - [25/Dec/2021:12:16:50 +0000] "GET /category/electronics HTTP/1.1" 200 61 "/category/finance" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

想象一下搜索数百万条看起来像这样的日志行! 看起来很可怕。 这就是为什么我们有像 Grok 这样的解析语言——让数据更易于阅读和搜索。

查看该数据并使用 Kibana 等分析工具进行搜索的一种更简单的方法是将其分解为具有值的字段,如下表所示:

1. ip:128.39.24.23
2. timestamp:25/Dec/2021:12:16:50 +0000
3. verb:GET
4. request:/category/electronics HTTP/1.1
5. status: 200
6. bytes: 61
7. referrer:/category/finance
8. os: Windows

让我们使用一个示例 Grok 模式来生成这些字段。 以下部分将展示 Grok 模式语法以生成上述每个字段。

对于每个部分,我们的 Grok 模式都会扩展,因为它包含更多要解析的字段。 这些模式是 Grok 可以阅读的正则表达式——我们可以使用它们来表达我们的信息。

下面是一些有用的链接,可以帮助你开始使用一些 Grok 模式。 但我们将在博客的其余部分提供更多示例。

  1. Grok pattern
  2. Grok Debugger

在 Grok pattern 页面,我们可以找到我们需要的预定义好的 pattern:

从某种意义上讲,这些 pattern 在本质上就是基于正则表达式的组合。你也可以创建自己定义的 pattern。这个在我的另外的文章有提到

  • Logstash:如何使用 Logstash Grok 过滤器提取模式
  • Elastic:在 Grok 中运用 custom pattern 来定义 pattern

让我们开始构建 Grok 模式来结构化数据。

我们使用以下方式描述模式的开始: ^
语法如下: %{pattern:Name_of_the_field}

请注意:不建议使用空格来描述字段的名称。

提取 IP

假设我们要提取 IP,我们可以使用 IP 方法:

^%{IP:ip}

然后我们有这些: – –

为了告诉 Grok 忽略它们,我们只需将它们添加到我们的模式中。

^%{IP:ip} - -

这个模式给了我们这个字段:

ip:128.39.24.23

为了测试方便,我们可以使用 Kibana 中所提供的 Grok debugger 来展示:

从上面的输出,我们可以看出来  ip 字段被解释。 上面所使用到的 IP pattern,你可以在地址进行查看:

提取 timestamps

在我们非结构化日志消息的下一部分中,我们将时间戳 “含” 在一个数组中:

[25/Dec/2021:12:16:50 +0000] 

要提取它,我们需要使用正则表达式和 HTTPDATE 方法,同时在外面添加括号,以便 Grok 知道忽略它们:

\[%{HTTPDATE:timestamp}\]

基于我们之前的模式,我们现在有:

^%{IP:ip} - - \[%{HTTPDATE:timestamp}\] 

这给了我们:

  "ip": "128.39.24.23","timestamp": "25/Dec/2021:12:16:50 +0000"

回到我们最初的非结构化消息,看起来我们有一个空间,时间戳结束,“GET 开始”。 我们还需要告诉 Grok 忽略空格。 为此,我们只需按键盘上的空格键,或者我们可以使用 %{SPACE} -> 直到 4 个空格。

提取 verbs

是时候提取 GET 字段了。 首先,我们需要告诉 Grok 忽略引号 - 然后使用 WORD 方法,我们将通过编写来做到这一点:

“%{WORD:verb}

所以,现在我们的模式是:

^%{IP:ip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:verb}

这给了我们这些字段:

  "ip": "128.39.24.23","verb": "GET","timestamp": "25/Dec/2021:12:16:50 +0000"

提取 request

为了提取请求 -> /category/electronics HTTP/1.1″,我们需要使用 DATA 方法,它本质上是正则表达式中的通配符。

这意味着我们需要添加一个句号来提取此信息,以告诉 DATA 方法在哪里停止——否则,它不会捕获任何数据。 我们可以使用引号作为停止标记:

%{DATA:request}"

现在,我们有以下 Grok 模式:

^%{IP:ip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request}"

这给了我们这些字段:

  "request": "/category/electronics HTTP/1.1","ip": "128.39.24.23","verb": "GET","timestamp": "25/Dec/2021:12:16:50 +0000"

提取 status

接下来是状态,但我们在请求结束和状态之间再次有一个空格,我们可以添加一个空格或 %{SPACE}。 为了提取数字,我们使用 NUMBER 方法。

%{NUMBER:status}

现在我们的模式扩展到:

^%{IP:ip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request}" %{NUMBER:status}

这给了我们如下的字段:

  "request": "/category/electronics HTTP/1.1","ip": "128.39.24.23","verb": "GET","timestamp": "25/Dec/2021:12:16:50 +0000","status": "200"

提取 Bytes

为了提取字节,我们需要再次使用 NUMBER 方法,但在此之前,我们需要使用常规空格或 %{SPACE}

^%{IP:ip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request}" %{NUMBER:status} %{NUMBER:bytes}

这给了我们如下的字段:

  "request": "/category/electronics HTTP/1.1","bytes": "61","ip": "128.39.24.23","verb": "GET","timestamp": "25/Dec/2021:12:16:50 +0000","status": "200"

提取 referrer

要提取 “referrer”,我们需要使用常规空格或 %{SPACE} -> “ 所以 Grok 会忽略它:

%{DATA:referrer}"

如你所见,我们添加 DATA 直到它遇到 " 字符:

这给了我们如下的字段:

  "request": "/category/electronics HTTP/1.1","referrer": "","bytes": "61","ip": "128.39.24.23","verb": "GET","timestamp": "25/Dec/2021:12:16:50 +0000","status": "200"

忽略数据及提取 os

现在我们想忽略这个数据 ->” “Mozilla/5.0 (compatible; MSIE 9.0; 为此,我们将使用 “Mozilla/5.0” 的 DATA 方法,但不写入该字段将忽略它。

然后我们将使用不带冒号或字段名的 WORD 方法忽略 (compatible;

最后,我们将使用 DATA 忽略 MSIE 9.0;

这给我们留下了以下模式来忽略该数据

%{DATA}\(%{WORD};%{DATA};

为了进一步解释这种模式......

\( -> 停止直到它到达 (
; -> 停止直到到达 ;

请注意上面的模式中的 \( 字符。第一个 DATA 遇到 \( 即停止,也就是第一个数据。第二个 DATA 停止直到遇到 ; 符号。同样地,第三个 DATA 停止直到遇到 ;

现在我们可以使用 WORD 方法提取 os -> %{WORD:os}。就是这样! 现在我们剩下以下 Grok 模式来构建我们的数据。

^%{IP:ip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request}" %{NUMBER:status} %{NUMBER:bytes} %{DATA:referrer}" %{DATA}\(%{WORD};%{DATA}; %{WORD:os}

这为我们提供了这些整洁的字段,我们可以使用这些字段更轻松地搜索和可视化我们的日志数据:

  "request": "/category/electronics HTTP/1.1","referrer": "\"/category/finance","os": "Windows","bytes": "61","ip": "128.39.24.23","verb": "GET","timestamp": "25/Dec/2021:12:16:50 +0000","status": "200"

至此,我们已经完成了对整个日志信息的结构化分析。接下来,你可以参考视频:

Logstash 日志解析的 Grok 模式示例

Logstash 日志解析的 Grok 模式示例_哔哩哔哩_bilibili

来了解如何在 Logstash 或者在 ingest pipeline 中进行使用这个 Grok pattern。

Logstash:日志解析的 Grok 模式示例相关推荐

  1. Logstash:如何逐步构建自定义 grok 模式

    在之前的文章 "在摄入时使用 grok 构建 Elasticsearch 数据以加快分析速度",我们研究了如何在摄取时构造非结构化数据(schema on write),以确保您的 ...

  2. Logstash:你喜欢 Grok 吗?

    作者:João Duarte Grok(动词)直觉地或同理心地理解(某事). 解析日志数据时最常见的任务之一是将原始文本行分解为一组其他工具可以操作的结构化字段. 如果你使用的是 Elastic St ...

  3. EFK6.3+kafka+logstash日志分析平台集群

    转载来源 :EFK6.3+kafka+logstash日志分析平台集群 :https://www.jianshu.com/p/f956ebbb2499 架构解读 : 第一层.数据采集层 安装fileb ...

  4. 解析mysqlbinlog日志_关于mysql-binlog日志解析框架

    欢迎广大码农爱好者向我推荐框架,我会择其精要.有趣者分享给大家. 今天下午,有同学献出了一款软件,说是海外澳洲番邦向朕进贡的,于是品尝了一番. 软件名称:mysql-binlog-connector ...

  5. logstash 日志_面试和书评:LogStash书,使日志管理变得容易

    logstash 日志 James Turnbull通过解释LogStash在日志项目上下文中的实现细节,为使用LogStash集中日志提供了令人信服的案例. < Logstash手册>通 ...

  6. SPINE:高拓展性、用户友好的自动化日志解析新神器

    编者按:在计算机系统与软件的实践和研究中,可靠性是至关重要且经久不衰的课题.如何自动化地分析日志所记录的系统状态并让数据"说话" ,受到了广泛研究.日志解析是自动化日志分析中的关键 ...

  7. binlog日志的三种模式

    statement level模式 每一条会修改数据的sql都会记录到master的bin-log中.Slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行. 优点 ...

  8. 《Flume日志收集与MapReduce模式》一2.2 Flume配置文件概览

    本节书摘来自华章出版社<Flume日志收集与MapReduce模式>一书中的第2章,第2.2节,作者 [美] 史蒂夫·霍夫曼(Steve Hoffman)斯里纳特·佩雷拉(Srinath ...

  9. canal应用一:基于mysql binlog的日志解析工具

    文章目录 前言 mysql 配置 canal 下载安装 canal client canal admin 常见问题 前言 canal 是阿里巴巴开发的MySQL数据实时同步工具,基于binlog增量日 ...

  10. mysql batch mode_MySQL数据库增量日志解析工具 Canal 实战

    简介 canal,阿里开源工具,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 应用场景 数据库实时备份 业务cache刷新 索引构建和实时维护,例:将商品数据推送到es中构建 ...

最新文章

  1. activity属性设置大全
  2. 自动化运维工具Puppet(管理资源)
  3. 【论文笔记】CNN for NLP
  4. Synergy 一套键鼠同时控制多台电脑的神器
  5. Linux字符设备驱动框架
  6. xampp中apache不能启动解决方法 (share)
  7. 反序列化 还是记一下吧
  8. 企业要搞数字化转型,是用一整套ERP,还是各搞各的数据系统?
  9. 面试官:说一下Jena推理
  10. 库克:大家会爱上有史以来最出色的iPhone和Apple Watch
  11. 【Sentry】Sentry安装
  12. Python(四):字符串
  13. 用html2canvas长按保存h5页面,html2canvas - 微信中长按存图 - 将h5活动结果保存到本地...
  14. 数码博主自用五款高性价比蓝牙耳机分享,双11不想踩雷选什么蓝牙耳机好?
  15. coxphfit+matlab,计算Cox比例风险模型的coxph和cph函数有什么区别?
  16. html输入框密码颜色,css解决浏览器输入框记住账号密码后的背景色
  17. php 小程序即时聊天,网易云IM小程序聊天室集成。PHP版SDK API使用示例
  18. 详解区块链项目如何做主体搭建?
  19. 全国计算机等级三级数据库技术知识点
  20. Vue+ElmentUI 实现表格可变表头,可变多级表头,自定义报表

热门文章

  1. Linux命令行上程序执行的那一刹那!
  2. linux上mysql定时备份数据库数据_linux下如何实现mysql数据库每天自动备份定时备份...
  3. matlab-如何进行边缘检测/边缘提取(对弹孔进行边缘检测)
  4. php里ajax提交form表单图片上传,PHPAJAXFORM提交图片上传并显示图片源码
  5. 用计算机弹出平凡之路节奏,计算机音乐谱平凡之路
  6. 【2020新书推荐】程序员值得一读的机器学习新书
  7. 对小波变换中DWT和CWT的理解
  8. Ubuntu 安装 7z 加解压软件及其命令行的使用
  9. 两个路由器互连设置方法
  10. 设置Chrome浏览器不加载图片的方法