天天看點

Elasticsearch攝取節點(十)——GeoIP以及Grok處理器IP解析處理器(GeoIP Processor)

IP解析處理器(GeoIP Processor)

處理器作用

GeoIP Processor主要是根據IP位址解析出具體的地理位置資訊的處理器。此處理器需要配合Maxmind資料庫中的資料。

ingest-geoip

子產品附帶的

GeoLite2 City

GeoLite2 Country

GeoLite2 ASN geoip2

資料庫,這些資料來自Maxmind。

geoip處理器可以與Maxmind中的其他GeoIP2資料庫一起運作,但是這些文檔必須指派到ingest-geoip配置目錄中,并且應該使用database_file選項來指定自定義資料庫的檔案名。必須存儲未壓縮的自定義資料庫檔案。ingest-geoip配置目錄位于$ES_CONFIG/ingest-geoip。

可選參數

字段 是否必填 預設值 說明
if 必填 - 擷取用于地理查找的ip位址的字段。
target_field 非必填 geoip 将儲存從Maxmind資料庫中查找的地理資訊的字段。
database_file 非必填 GeoLite2-City.mmdb geoip配置目錄中的資料庫檔案名。GeoLite2-City.mmdb, GeoLite2-Country.mmdb and GeoLite2-ASN.mmdb
properties 非必填 [continent_name, country_iso_code, region_iso_code, region_name, city_name, location] * 基于地理位置查找,控制将哪些屬性添加到target_field
ignore_missing 非必填 false 當字段不存在或者為null的時候,處理器是否忽略此資料

database_file

  • 如果使用GeoLite2-City.mmdb,則可以在target_field下添加以下字段:ip、country_iso_code、country_name、continent_name、region_iso_code、region_name、city_name、時區、緯度、經度和位置。實際添加的字段取決于找到了什麼以及在屬性中配置了哪些屬性。
  • 如果使用GeoLite2-Country.mmdb,則可以在target_field下添加以下字段:ip、country_iso_code、country_name和continent_name。實際添加的字段取決于找到了什麼以及在屬性中配置了哪些屬性。
  • 如果使用GeoLite2-ASN.mmdb,則可以在target_field下添加以下字段:ip、ASN和organization_name。實際添加的字段取決于找到了什麼以及在屬性中配置了哪些屬性。

使用方式

下面例子中嘗試解析我自己的伺服器IP位址,使用

GeoLite2-ASN.mmdb

資料。

POST _ingest/pipeline/_simulate
{
    "pipeline": {
        "description": "GeoIP處理器",
        "processors": [
            {
                "geoip": {
                  "database_file":"GeoLite2-ASN.mmdb",
                    "field": "ip"
                }
            }
        ]
    },
    "docs": [
        {
            "_source": {
                "ip": "47.**.**.0"
            }
        }
    ]
}
           

在傳回結果中可以看到相關組織的參數解析。因為使用的是阿裡的産品是以會顯示所屬組織為阿裡巴巴

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "geoip" : {
            "asn" : 37963,
            "ip" : "47.**.**.0",
            "organization_name" : "Hangzhou Alibaba Advertising Co.,Ltd."
          },
          "ip" : "47.**.**.0"
        },
        "_ingest" : {
          "timestamp" : "2019-12-14T07:44:29.877038Z"
        }
      }
    }
  ]
}
           

修改IP緩存

geoip處理器會緩存IP解析的内容,可以通過修改參數

ingest.geoip.cache_size

來控制緩存數量,其參數預設為1000。另外需要注意的是這個參數是基于節點設定的,也就是說每個處理節點都會有一個緩存。

Grok處理器(Grok Processor)

概述

這個工具非常适合syslog日志、apache和其他webserver日志、mysql日志,以及通常為人類而不是計算機編寫的任何日志格式。這個處理器附帶了許多可重用的模式。

Grok Processor和Dissect Processor的功能是一樣的,就像Dissect Processor之前介紹的,其不支援正規表達式。而Grok Processor支援正規表達式。而且官方文檔中也明确表示任何正規表達式在Grok中都是有效的。

Grok利用這種正規表達式語言來命名現有的模式,并将它們組合成與字段比對的更複雜的模式。重用grok模式的文法有三種形式:%{syntax:SEMANTIC}、%{syntax}、%{syntax:SEMANTIC:TYPE}。

  1. SYNTAX 文法是與文本比對的模式的名稱。例如,3.44将由數字模式比對,55.3.244.1将由IP模式比對。文法是如何比對的。NUMBER和IP都是預設模式集中提供的模式
  2. SEMANTIC 語義是你給比對文本的辨別符。例如,3.44可以是事件的持續時間,是以可以簡單地稱之為持續時間。此外,字元串55.3.244.1可能辨別送出請求的客戶機。
  3. TYPE 類型是您希望轉換指定字段的類型。int、long、double、float和boolean都支援強制類型。

字段解釋

字段 是否必填 預設值 說明
field 必填 - 用于grok表達式解析的字段
patterns 必填 - 用于比對和提取指定捕獲的grok表達式的有序清單。傳回清單中第一個比對的表達式。
pattern_definitions 非必填 - 定義要由目前處理器使用的自定義模式的模式名稱和模式元組的映射。與現有名稱比對的模式将覆寫現有的定義。
trace_match 非必填 false 當真實,_ingest。_grok_match_index将被插入到比對文檔的中繼資料中,并将索引插入到比對模式中的模式中。
ignore_missing 非必填 false 當字段不存在或者為null的時候,處理器是否忽略此資料
if 非必填 - 執行這個處理器的條件
on_failure 非必填 - 異常處理内容
ignore_failure 非必填 false 是否忽略異常處理
tag 非必填 - 此處理器的辨別符。用于調試使用

使用例子

比如下面的資訊,使用提供的模式從文檔中的字元串字段提取和命名結構化字段

POST _ingest/pipeline/_simulate
{
    "pipeline": {
        "description": "...",
        "processors": [
            {
                "grok": {
                    "field": "message",
                    "patterns": [
                        "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"
                    ]
                }
            }
        ]
    },
    "docs": [
        {
            "_source": {
                "message": "55.3.244.1 GET /index.html 15824 0.043"
            }
        }
    ]
}
           

其結果被解析為:

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "duration" : "0.043",
          "request" : "/index.html",
          "method" : "GET",
          "bytes" : "15824",
          "client" : "55.3.244.1",
          "message" : "55.3.244.1 GET /index.html 15824 0.043"
        },
        "_ingest" : {
          "timestamp" : "2019-12-18T12:19:56.421134Z"
        }
      }
    }
  ]
}


           

假如希望查詢處理器使用的解析模式可以使用下面的請求API

GET _ingest/processor/grok
           

其傳回内容是一個字典的鍵-值表示形式。

{
  "patterns" : {
    "BACULA_CAPACITY" : "%{INT}{1,3}(,%{INT}{3})*",
    "PATH" : "(?:%{UNIXPATH}|%{WINPATH})",
    "MONGO_SLOWQUERY" : "%{WORD} %{MONGO_WORDDASH:database}\\.%{MONGO_WORDDASH:collection} %{WORD}: %{MONGO_QUERY:query} %{WORD}:%{NONNEGINT:ntoreturn} %{WORD}:%{NONNEGINT:ntoskip} %{WORD}:%{NONNEGINT:nscanned}.*nreturned:%{NONNEGINT:nreturned}..+ (?<duration>[0-9]+)ms",
    ...
}

           

支援配置

執行時間過長的Grok表達式會被中斷,而grok處理器有一個看門狗線程,此線程沒過一段時間檢測是否逾時。此頻率可以使用下面參數進行修改

# 預設1秒鐘
ingest.grok.watchdog.interval
           

而執行時間可以通過下面的參數進行配置

ingest.grok.watchdog.max_execution_time
           
個人水準有限,上面的内容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關内容。假如我的這篇内容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。