2016-11-28 3 views
2

Ich versuche, eine Zeile in einer Logdatei mit der Onigurama Regex-Bibliothek (in Logstash) mit einem negativen Look-Behind zu erfassen, aber es scheint immer noch die Linie, die es nicht sollte übereinstimmen. Ich versuche, nur die Top-Level-Ausnahme und nicht die mit verursacht durch Start zum Spiel:Regex Onigurama Negative Lookbehind funktioniert nicht

Jemand hat mir geholfen, dieses

auf Rubular http://rubular.com/r/N3AzySNHiS

Regex

Geprüft
^(?<!Caused by:).*?Exception 

(?<!^Caused by:).*?Exception 
Getestet schreiben

Nachricht:

2016-11-15 05:19:28,801 ERROR [App-Initialisation-Thread] appengine.java:520 Failed to initialize external authenticator myapp Support Access || [email protected]:/mnt/data/install/assembly [email protected] 
java.lang.IllegalArgumentException: Could not check if provided root is a directory 
    at com.myapp.jsp.KewServeInitContextListener$1.run(QServerInitContextListener.java:104) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.nio.file.NoSuchFileException: fh-ldap-config/ 
    at com.upplication.s3fs.util.S3Utils.getS3ObjectSummary(S3Utils.java:55) 
    at com.upplication.s3fs.util.S3Utils.getS3FileAttributes(S3Utils.java:64) 

Logstash führen

"exception" => "Caused by: java.nio.file.NoSuchFileException" 
+0

Versuchen Sie '^ (?! verursacht durch:). *? Exception' oder'^(?! verursacht durch:) (? . *? Exception) ' –

+0

Vielen Dank für die Antwort Wiktor, zuerst zurückgegeben' " Ausnahme "=>" bei java.lang.Thread.run (Thread.java:745) \ nVerwendet von: java.nio.file.NoSuchFileException "', der zweite gab 2 Ergebnisse zurück "" Ausnahme "=> [ [0 ] "at java.lang.Thread.run (Thread.java:745) \ nVerwendet von: java.nio.file.NoSuchFileException", [1] "at java.lang.Thread.run (Thread.java:745) \ nVerwendet von: java.nio.file.NoSuchFileException "' – Arturski

+0

Ich vermute, dass es eine Einstellung gibt, die das '.' Symbol in der Regex mit den Zeilenumbruch-Symbolen übereinstimmt. Oder eine andere Option wie Ignore whitespace ist ON. Bitte überprüfen Sie, ob der MULTILINE-Modus überall aktiviert ist. Außerdem ist es eine gute Idee, das '^ (?!! verursacht durch:) (? [^ \ r \ n] *? Exception)' Regex –

Antwort

1

Es scheint einige zusätzliche Optionen festgelegt in Ihrem Logstach Umgebung gibt. Bei meinen Tests vermute ich, dass die Option "Ausführlich" oder "Whitespace ignorieren" aktiviert ist. Auch mit . alle anderen Fragen auszuschließen (das kann neu definiert werden, um Zeilenumbruch Symbole entsprechen), können Sie eine eindeutige [^\r\n] (alle Zeichen nicht \r und \n) verwenden:

^(?!Caused\ by:)(?<exception>[^\r\n]*?Exception) 
      ^^     ^^^^^^^ 

Der entkommen Raum wird immer passen ein einzelner regulärer Raum.

+1

Danke nochmal Wiktor! Arbeiten gut und schätzen die Erklärung – Arturski

+0

Ja, danke Dank Wiktor, wir haben es geschafft, das doppelte Ergebnis zu beseitigen, indem Sie entfernen? , also war die letzte Regex '^ (?! verursacht durch:) ([^ \ r \ n] *? Exception) ' – Arturski

+0

Das bedeutet die [' named_captures_only'] (https://www.elastic.co/ guide/de/logstash/current/plugins-filter-grok.html # plugins-filters-grok-named_captures_only) wurde auf * false * gesetzt. Wenn es Standard wäre (* wahr *), würde die benannte Erfassungsgruppe nur ausgegeben werden. –

0

Hinweis: Ich nehme in dieser Antwort an, dass die 2 einzelnen Protokollzeilen, die im unten aufgeführten Problem aufgeführt sind, keine Zeilenumbrüche enthalten und über das mehrzeilige Codec-Plug-in in logstash verarbeitet oder in irgendeiner Weise entfernt wurden.

TL; DR die Lösung eine negative Lookbehind Mit

Ein negativen Blick hinter funktioniert, wenn es danach einen entsprechenden Anker gegeben. Betrachtet man die beiden Linien dies gut funktionieren würde:

^(?<!Caused by:)java.*Exception

Hinweis: es nur ^(?<!Caused by:)j.*Exception sein könnte, aber ich denke, die java macht es besser lesbar.

Erläuterung Problem mit Beispielcode

Das Problem mit dem gegebenen regulären Ausdrücken: ^(?<!Caused by:).*?Exception und (?<!^Caused by:).*?Exception ist das nur ungern *? quantifier, das etwas angepasst werden erlaubt 0 oder mehrmals. Nun, wie in dieser answer erläutert, beginnt die Regex-Engine am Anfang der Zeichenfolge und bewegt sich nach links zum Schreiben. Die kleinstmögliche Anzahl von Zeichen (da es widerwillig ist) ist nichts anderes als die Engine Exception nicht übereinstimmen kann und dann inkrementell versucht, alles (.) vor Exception ("backtracking") nach links zu bewegen, um zu schreiben.

Also versucht die Regex-Engine immer wieder ein Zeichen (von links nach rechts) zu finden, bis Exception gefunden wird, nachdem was verbraucht wurde.Deshalb ist die Zeichenfolge

Caused by: java.nio.file.NoSuchFileException: fh-ldap-config/ at com.upplication.s3fs.util.S3Utils.getS3ObjectSummary(S3Utils.java:55) at com.upplication.s3fs.util.S3Utils.getS3FileAttributes(S3Utils.java:64)

überein, weil der Motor alles bis zu Exception und Caused by: verbraucht hat nicht vor dieses Spiel erscheinen. Im Wesentlichen hat die .*? die Caused by: verbraucht, die der negative Lookbehind sucht.

Verständnis Deeper

Um zu verstehen, was die Regex-Engine tatsächlich mit lookarounds tut empfehle ich sehen diese answer

Ich denke, es einfach ist, durch quantifiers und lookarounds und als allgemeine Regel, die ich erwischt Denken Sie, dass Lookarounds von etwas Beton verankert sein müssen (nicht .). Um zu verstehen, was ich meine, lassen Sie uns eine leichte Variation der gegebenen Regex mit dem gierigen * Quantifizierer betrachten. Die Regex ^(?<!Caused by:).*Exception entspricht auch der Zeichenfolge in Anführungszeichen.

Der Grund dafür ist, dass das gierige * Qualifikationsmerkmal beginnt, indem es die gesamte Zeichenfolge konsumiert und dann von rechts nach links zurücklegt, wie in der ersten verknüpften Antwort oben erklärt. Aus dem gleichen Grund (aber von der anderen Seite), sobald der Motor Exception entspricht, hält es alles vom Anfang der Schnur bis Exception. Es schaut dann hinter das, was es verbraucht hat und findet Caused by: nicht und stimmt die Zeichenfolge erfolgreich ab.

In Zusammenfassung, als allgemeine Regel

Immer Anker lookarounds wenn gierig oder nur ungern quantifiers verwenden.