Elastic:在 Grok 中运用 custom pattern 来定义 pattern

摘要:
它由空格字符串分隔。如果没有正确的Grok模式来帮助我们提取,那么很难提取完整的日期。我们可以单击上面的客户模式并输入以下句子:EVENTDATE%{YEAR}%{MONTHNUM}%}MONTHDAY}%{TIME}。在上面,我们将EVENDATE定义为YEAR、MONTHNUM、MONTHDAY和TIME的组合。那么我们应该如何处理上面的自定义模式呢?我们可以创建以下命令:POST/_摄取/管道/_模拟{“管道”:{“处理器”:〔{”grok“:{”field“:”message“,”patterns“:〔”%{IP:IP}%{EVENTDATE:@timestamp}%{WORD:server}进程%{NUMBER:Process_id}%}WORD:action}“〕,”pattern _definitions“:”{“EVENTDATE”:“%{YEAR}%”{MONTNUM}%%{MONTHDAY}%“}”}”,“Docs”:[{”_source“:{”message“:”157.97.192.702019092900:39:02.912 myserverProcess107673Initializing“}}]}运行上述命令:{“Docs”:〔{”doc“:”_index“:”index“,”type“:”_doc“,”id“:”_id“,“_source”:{服务器“:”myserver“,”process_id“:“107673”,”@timestamp“:”2019092900:39:02-912“,,”ip“:”15.7.97.192.70“,”action“:”正在初始化“,”消息“:“157.97.192.702019092900:39:02.912myserverProcess107673Initializing”},“_ingest”:{“timestamp”:“2020-06-15T08:33:01.28191Z”}}}]}这表明我们的日志已正确解析和结构化。另一种方法是使用setprocessor通过使用上述日期相关字段来形成我们需要的@timestamp字段。

我们先来看一下如下的一个日志:

157.97.192.70 2019 09 29 00:39:02.912 myserver Process 107673 Initializing

在上面的日志中,我们可以看到一个日期信息:2019 09 29 00:39:02.912。它是被空格字符串所分开,如果没有正确的 Grok pattern 来帮我们提取的话,我们将会很难提取到一个完整的日期。我们的日志信息符合如下的一个数据结构:

ip timestamp server Process process_id action

首先,我们打开 Kibana:

Elastic:在 Grok 中运用 custom pattern 来定义 pattern第1张

 Elastic:在 Grok 中运用 custom pattern 来定义 pattern第2张

 我们可以先提取 IP:

Elastic:在 Grok 中运用 custom pattern 来定义 pattern第3张

 之后的,就是年,月,日,及时间。我们可以通过如下的方式来进行提取:

  • 运用 YEAY 来提取年份
  • 运用 MONTHNUM 来提取月份
  • 运用 MONTHDAY 来提取日期
  • 运用 TIME 来提取时间
  • 运用 WORD 来提取一个单词
  • 运用 NUMBER 来提取一个数值
  • 对于 Process 来说,我们就不提取了,忽略它

这样,我们可以使用如下的 Grok pattern:

%{IP:ip} %{YEAR:year} %{MONTHNUM:month} %{MONTHDAY:day} %{TIME:time} %{WORD:server} Process %{NUMBER:process_id} %{WORD:action}

Elastic:在 Grok 中运用 custom pattern 来定义 pattern第4张

 显然,它正确地解析了我们的日志,但是美中不足的是我们最终需要的是一个真正的日期,而不是用 year, month, day, time  来表示的一个时间。我们可以点击上面的 custerm pattern,并输入一下的句子:

EVENTDATE %{YEAR} %{MONTHNUM} %{MONTHDAY} %{TIME}

Elastic:在 Grok 中运用 custom pattern 来定义 pattern第5张

在上面,我们定义了 EVENDATE  为 YEAR, MONTHNUM, MONTHDAY 及 TIME 的组合。那么我们该如和应用上面的 custom patttern呢?

我们必须修改上面的 Grok pattern 为:

%{IP:ip} %{EVENTDATE:@timestamp} %{WORD:server} Process %{NUMBER:process_id} %{WORD:action}

Elastic:在 Grok 中运用 custom pattern 来定义 pattern第6张

从上面,我们可以看出来,我们的 EVENTDATE 起作用了。它正确地解析了我们的时间。

那么在我们实际的使用中,我们该如何地应用呢?

我们可以创建如下的一个命令:

POST /_ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            "%{IP:ip} %{EVENTDATE:@timestamp} %{WORD:server} Process %{NUMBER:process_id} %{WORD:action}"
          ],
          "pattern_definitions": {
            "EVENTDATE": "%{YEAR} %{MONTHNUM} %{MONTHDAY} %{TIME}"
          }
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "157.97.192.70 2019 09 29 00:39:02.912 myserver Process 107673 Initializing"
      }
    }
  ]
}

运行上面的命令:

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "server" : "myserver",
          "process_id" : "107673",
          "@timestamp" : "2019 09 29 00:39:02.912",
          "ip" : "157.97.192.70",
          "action" : "Initializing",
          "message" : "157.97.192.70 2019 09 29 00:39:02.912 myserver Process 107673 Initializing"
        },
        "_ingest" : {
          "timestamp" : "2020-06-15T08:33:01.28191Z"
        }
      }
    }
  ]
}

上面显示我们的日志被正确地解析并结构化。

另外一种方法是通过 set processor 来把上面的日期相关的字段来组成我们需要的 @timestamp 字段。

POST /_ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            "%{IP:ip} %{YEAR} %{MONTHNUM} %{MONTHDAY} %{TIME} %{WORD:server} Process %{NUMBER:process_id} %{WORD:action}"
          ]
        }
      },
      {
        "set": {
          "field": "@timestamp",
          "value": "{{year}} {{month}} {{day}} {{time}}"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "157.97.192.70 2019 09 29 00:39:02.912 myserver Process 107673 Initializing"
      }
    }
  ]
}

在上面,我们通过:

      {
        "set": {
          "field": "@timestamp",
          "value": "{{year}} {{month}} {{day}} {{time}}"
        }
      }

来把 @timestamp 进行定义,它组合了 year, month, day 及 time 的值。

转载自:https://blog.csdn.net/UbuntuTouch/article/details/106764157

免责声明:文章转载自《Elastic:在 Grok 中运用 custom pattern 来定义 pattern》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySql中delimiter的作用是什么?容器层叠目录 overlay2 diff merged下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net微信公众号开发——快速入门【转载】

最近在学习微信公众号开发,将学习的成果做成了一个类库,方便重复使用。 现在微信公众号多如牛毛,开发微信的高手可以直接无视这个系列的文章了。 使用该类库的流程及寥寥数行代码得到的结果如下。 本文的源代码主要在:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/xr...

ORACLE 数据、表误删恢复(转)

今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法原理: 利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接...

数据仓库基础(六)数据的ETL

ETL是数据抽取(Extract)、转换(Transform)、加载(Load)的简写,是构建数据仓库最重要的一步。 1.抽取 抽取时元数据进入到数据仓库的第一步。因为每个业务系统数据的质量不相同,所以需要对每个数据源建立不同的抽取程序。 抽取的主要功能: 提供数据匹配器的功能:这样使得程序可以与多种业务数据源相连接。 提供标准化的功能:抽取最重要的一个功...

获取当前时间并格式化输出、时间戳转标准格式

//获取当前时间并且格式化输出 getTime(){ let date1=newDate(); let year=this.appendZero(date1.getFullYear()); let month=this.appendZero(date1.getMonth()+1) let day=this....

js 时间戳转换为‘yyyy-MM-dd hh:mm’格式(es6语法)

function formatDate(date,fmt) { if(/(y+)/.test(fmt)){ fmt = fmt.replace(RegExp.$1,(date.getFullYear()+'').substr(4-RegExp.$1.length)); } let o = { 'M+':date.getMonth...

交易所如何对接狗狗币(DOGE)钱包?这点不可忽视

一个大家非常熟悉的 meme 头像 doge 在一夜之间成为了全球热搜。在国内,「狗狗币一天暴涨逾 250%」登上了微博热搜第七位,在国外,「DOGE」或者「DOGECOIN」站上了多个地区的「推特趋势榜」。比特币似乎都没有如此高规格的待遇。   对于新入币圈的朋友们可能对狗狗币还不太熟悉。这个币是个很早期的山寨币,它基本上是比特币的翻版,但是在比特币的基...