Elastic:在 Grok 中運用 custom pattern 來定義 pattern

咱們先來看一下以下的一個日誌:數據結構

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

在上面的日誌中,咱們能夠看到一個日期信息:2019 09 29 00:39:02.912。它是被空格字符串所分開,若是沒有正確的 Grok pattern 來幫咱們提取的話,咱們將會很難提取到一個完整的日期。咱們的日誌信息符合以下的一個數據結構:spa

ip timestamp server Process process_id action

首先,咱們打開 Kibana:.net

 

 

 

 咱們能夠先提取 IP:3d

 

 以後的,就是年,月,日,及時間。咱們能夠經過以下的方式來進行提取:日誌

  • 運用 YEAY 來提取年份
  • 運用 MONTHNUM 來提取月份
  • 運用 MONTHDAY 來提取日期
  • 運用 TIME 來提取時間
  • 運用 WORD 來提取一個單詞
  • 運用 NUMBER 來提取一個數值
  • 對於 Process 來講,咱們就不提取了,忽略它

這樣,咱們能夠使用以下的 Grok pattern:code

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

 

 顯然,它正確地解析了咱們的日誌,可是美中不足的是咱們最終須要的是一個真正的日期,而不是用 year, month, day, time  來表示的一個時間。咱們能夠點擊上面的 custerm pattern,並輸入一下的句子:server

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

 

 

在上面,咱們定義了 EVENDATE  爲 YEAR, MONTHNUM, MONTHDAY 及 TIME 的組合。那麼咱們該如和應用上面的 custom patttern呢?blog

咱們必須修改上面的 Grok pattern 爲:ip

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

 

 

從上面,咱們能夠看出來,咱們的 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

相關文章
相關標籤/搜索