हम एक ग्रोक फ़िल्टर अनुकरण करने के लिए Elasticsearch में पाइपलाइन का उपयोग कर रहे हैं। हम निम्नलिखित अजीब व्यवहार का सामना करते हैं।

यदि टाइमस्टैम्प फ़ील्ड संदेश की शुरुआत में है तो ग्रोक फ़िल्टर काम नहीं करता है।

## GROK NOT WORK
    POST /_ingest/pipeline/_simulate
    {
      "pipeline": {
        "processors": [
          {
            "grok": {
              "field": "message",
              "patterns": ["""%{TIMESTAMP_ISO8601:@timestamp} %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{TIMESTAMP_ISO8601:@timestamp}"""]
            }
          }
        ]
      },
        "docs": [
        {
          "_source": {
            "message": "2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  "
          }
        }
      ]
    }

हमारे पास निम्न त्रुटि है:

{
  "docs" : [
    {
      "error" : {
        "root_cause" : [
          {
            "type" : "illegal_argument_exception",
            "reason" : "Provided Grok expressions do not match field value: [2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  ]"
          }
        ],
        "type" : "illegal_argument_exception",
        "reason" : "Provided Grok expressions do not match field value: [2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  ]"
      }
    }
  ]
}

इस प्रारूप में, संदेश के अंत में टाइमस्टैम्प, ग्रोक फ़िल्टर ठीक काम करता है।

    ## GROK WORKS FINE
    POST /_ingest/pipeline/_simulate
    {
      "pipeline": {
        "processors": [
          {
            "grok": {
              "field": "message",
              "patterns": ["""%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{TIMESTAMP_ISO8601:@timestamp}"""]
            }
          }
        ]
      },
        "docs": [
        {
          "_source": {
            "message": "55.3.244.1 GET /index.html 15824 0.043 2019-09-29T00:39:02.91ZZ"
          }
        }
      ]
    }

अग्रिम में धन्यवाद

0
brunillopu 18 अप्रैल 2020, 12:01
1
मुझे यह अजीब लगता है कि आपके टाइमस्टैम्प के अंत में दो ZZ वर्ण हैं... ISO8601-संगत नहीं लगता
 – 
Val
18 अप्रैल 2020, 12:18

3 जवाब

आपके पहले उदाहरण से मुझे आपकी GROK अभिव्यक्ति के साथ 2 समस्याएं दिखाई देती हैं:

  1. ग्रोक एक्सप्रेशन के अंत में आपके पास दूसरा टाइमस्टैम्प है (शायद कॉपी पेस्ट इश्यू?)
  2. दूसरा मुद्दा आपके टाइमस्टैम्प के अंत में टाइमज़ोन ZZ है। यदि आप इसे अनदेखा करना चाहते हैं तो आप इस अतिरिक्त टाइमज़ोन वर्णों की अवहेलना करने के लिए अपने टाइमस्टैम्प के ठीक बाद% {NOTSPACE} जोड़ सकते हैं।

आप निम्नलिखित ग्रोक को आजमा सकते हैं:

%{TIMESTAMP_ISO8601:timestamp}%{NOTSPACE} %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

यह ग्रोक डीबगर में परीक्षण किया गया था और मेरे लिए काम कर रहा है। मेरा सुझाव है कि आप ग्रोक डीबगर (किबाना-> देव टूल्स-> ग्रोक डीबगर में) के साथ मिलकर काम करें या आप कुछ ऑनलाइन ग्रोक डीबगर पा सकते हैं।

अंत में, मेरा सुझाव है कि आप ES में अधिक/छोटे फ़िल्टर का उपयोग करने में सक्षम होने के लिए %{NUMBER:duration:float} जैसे "NUMBER" प्रारूप का उपयोग करने के बाद :int या :float जोड़ें।

0
eladyanai 27 मई 2020, 10:45

उनका समय के बाद "ZZ" है जो आईएसओ संगत नहीं है।

आप .* --> "0 या अधिक किसी भी वर्ण को जोड़ सकते हैं"

%{TIMESTAMP_ISO8601:@timestamp}.*

और * अंतिम टाइमस्टैम्प पैटर्न के बाद इसे वैकल्पिक बनाने के लिए

{
  "pipeline": {
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            "%{TIMESTAMP_ISO8601:@timestamp}.* %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{TIMESTAMP_ISO8601:@timestamp}*"
          ]
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "2019-09-29T00:39:02.91ZZ 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",
          "@timestamp" : "2019-09-29T00:39:02.91Z",
          "method" : "GET",
          "bytes" : "15824",
          "client" : "55.3.244.1",
          "message" : "2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  "
        },
        "_ingest" : {
          "timestamp" : "2020-04-18T10:43:39.8725873Z"
        }
      }
    }
  ]
}
-1
jaspreet chahal 18 अप्रैल 2020, 13:44
आपका सुझाया समाधान काम नहीं कर रहा है। आपने इस तथ्य की अवहेलना की है कि उसके पास GROK पैटर्न के अंत में दूसरा टाइमस्टैम्प है जो इसे विफल कर रहा है। ग्रोक एक्सप्रेशन को रेगुलर एक्सप्रेशन के साथ मिलाना भी एक बुरा अभ्यास है जब इससे बचना संभव हो।
 – 
eladyanai
27 मई 2020, 10:50

दिनांक से मिलान करने के लिए https://regex101.com/r/eRAJg3/1 का उपयोग कर सकते हैं। एलएमके अगर वह मदद करता है।

फिर आप अपने ग्रोक एक्सप्रेशन में ओनिगुरुमा सिंटैक्स का उपयोग कर सकते हैं:

(?<ts>([\d]{4}-[\d]{2}-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}\.[\d]{2}Z{2}))

संदर्भ के लिए: https://www.elastic .co/guide/hi/logstash/current/plugins-filters-grok.html#_custom_patterns

आपको अपनी पहली अभिव्यक्ति से टाइमस्टैम्प के दूसरे उदाहरण को भी हटा देना चाहिए, जैसा कि एलादानई ने बताया।

पूर्णता के लिए, मैं पूर्ण अभिव्यक्ति प्रदान करूंगा:

(?<ts>([\d]{4}-[\d]{2}-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}\.[\d]{2}Z{2})) %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}%{SPACE}
0
aaaa 10 जून 2020, 21:13