2016-05-09 12 views
0

Ich habe einen einfachen ELK-Stack, wo mehrere Maschinen Logs an einen ElasticSearch (ES) -Server schicken und ich sie mit Kibana überprüfe.ElasticSearch findet System.NullReferenceException, aber nicht NullReferenceException - warum?

Mein Problem ist, dass ich viele System.NullReferenceException Übereinstimmungen sehen kann, aber keine von NullReferenceException, die mich sehr verwirrt.

Hier wird die Abfrage Ich versuche zu laufen:

GET _search 
{ 
    "query": { 
    "match": { 
     "message": "NullReferenceException" 
    } 
    } 
} 

Und das Ergebnis ist:

{ 
    "took": 47, 
    "timed_out": false, 
    "_shards": { 
    "total": 1681, 
    "successful": 1681, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 0, 
    "max_score": null, 
    "hits": [] 
    } 
} 

Allerdings, wenn ich verwenden Sie die folgende Abfrage:

GET _search 
{ 
    "query": { 
    "match": { 
     "message": "System.NullReferenceException" 
    } 
    } 
} 

I erhalten:

{ 
    "took": 31, 
    "timed_out": false, 
    "_shards": { 
    "total": 1681, 
    "successful": 1681, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 12796, 
    "max_score": 1.7968642, 
    "hits": [ 
     { 
     "_index": "logs-good-qa_849-2016.05.05", 
     "_type": "MobileWebService", 
     "_id": "28327d702db62623059027479162a3d73ef909f6", 
     "_score": 1.7968642, 
     "_source": { 
      "@timestamp": "2016-05-05T19:04:20.741Z", 
      "message": "Object reference not set to an instance of an object. \r\nSystem.NullReferenceException: Object reference not set to an instance of 
... 

Die Nachrichtenspalte scheint analysiert zu werden. Wenn ich die Zuordnung anfordern:

GET logs-good-qa_849-2016.05.05/_mapping/MobileWebService 

bekomme ich wieder dieses:

# GET logs-good-qa_849-2016.05.05/_mapping/MobileWebService 
{ 
    "logs-good-qa_849-2016.05.05": { 
    "mappings": { 
     "MobileWebService": { 
     "properties": { 
      "@timestamp": { 
      "type": "date", 
      "format": "strict_date_optional_time||epoch_millis" 
      }, 
      "@version": { 
      "type": "string" 
      }, 
      "host": { 
      "type": "string" 
      }, 
      "level": { 
      "type": "string" 
      }, 
      "logger": { 
      "type": "string" 
      }, 
      "message": { 
      "type": "string" 
      }, 
      "path": { 
      "type": "string" 
      }, 
      "qa_build": { 
      "type": "string" 
      }, 
      "tags": { 
      "type": "string" 
      }, 
      "ts": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

woraus ich schließe, dass das Nachrichtenfeld durch die Worttrennzeichen und indiziert bzw. gebrochen werden sollte. Soweit ich weiß . ist ein Wortbegrenzer, also verstehe ich nicht was los ist.

Irgendwelche Ideen?

Antwort

1

Lassen Sie uns versuchen, den Inhalt des message Feld zu analysieren:

curl -XGET 'localhost:9200/accounts_2016_dev/_analyze?pretty' -d 'Object reference not set to an instance of an object. \r\nSystem.NullReferenceException: Object reference not set to an instance of' 

Einer der Token wir das bekommen folgt:

{ 
    "token" : "nsystem.nullreferenceexception", 
    "start_offset" : 57, 
    "end_offset" : 87, 
    "type" : "<ALPHANUM>", 
    "position" : 12 
    } 

Wie Sie der Punkt kann nicht sehen, wie ein verwendet wird Wortbegrenzer, da dahinter kein Leerzeichen steht. Allgemeiner erzeugt die Analyse test.dot ein einzelnes Token test.dot, während die Analyse test. dot (mit 1+ Leerzeichen hinter dem Punkt) zwei Tokens test und dot produziert.

Aus diesem Grund können Sie nur NullReferenceException nicht übereinstimmen.

+0

Das ist eine ausgezeichnete Erklärung. Vielen Dank. Also, ich denke, ich muss hinzufügen "." zu den Trennzeichen und alles neu indizieren. Können Sie den besten Weg vorschlagen? – mark

+0

Ich bin nicht sicher, nur '.' Hinzuzufügen ist eine gute Idee, da Sie das Risiko der Teilung von Dezimalzahlen, z. '3.4' würde in' 3' und '4' aufgeteilt und das ist wahrscheinlich nicht das was du willst. Der beste Weg, um das zu erreichen, was Sie wollen, wäre ein benutzerdefinierter Analysator, der [den ngram-Token-Filter] (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenfilter) nutzt. html) und/oder [der edgeNgram-Token-Filter] (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenfilter.html), um Präfixe und Suffixe für jedes Token zu erzeugen . – Val

+0

Kundenspezifischer Analysator? Hört sich gruselig an. Ich fange an zu denken, dass ich vielleicht zu viel verlangte, obwohl ich nicht glaube, dass mein Wunsch, nach "NullReferenceException" zu suchen, zu groß ist. Fehle ich etwas (ich könnte, da ich sehr neu in diesem ganzen Geschäft von ELK bin)? – mark

Verwandte Themen