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.
Versuchen Sie '^ (?! verursacht durch:). *? Exception' oder'^(?! verursacht durch:) (?. *? Exception) ' –
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
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 –