2016-08-03 2 views
0

Wie könnten wir Fehlerfälle in Protokolldateien wie erkennen:Fang das Fehlen eines Musters (aktualisiert) im Anschluss an ein anderes (INSERT/UPDATE/DELETE)

[DEBUG][2016-08-02 17:11:22,047][DbConn] - [INSERT INTO table1 ...] 
[DEBUG][2016-08-02 17:11:22,461][DbConn] - [Updated: 16282 records] 
[DEBUG][2016-08-02 17:11:22,465][DbConn] - [ UPDATE table2 SET ...] 
[DEBUG][2016-08-02 17:11:22,616][DbConn] - [Updated: 3 records] 
[DEBUG][2016-08-02 17:11:22,620][DbConn] - [ DELETE FROM table3 WHERE ...] 
[DEBUG][2016-08-02 17:11:22,786][DbConn] - [Updated: 1 records] 
[DEBUG][2016-08-02 17:11:23,723][DbConn] - [INSERT INTO table4 ...] 
[DEBUG][2016-08-02 17:11:24,442][DbConn] - [SELECT * FROM table5 ...] 

wo die Abwesenheit von Updated: X records zeigt, dass Die Anfrage wurde nicht korrekt ausgeführt.

In diesem Beispiel sollte Zeile 7 (INSERT INTO table4 ...) ausgegeben werden, wenn bei der Ausführung dieser SQL-Anfrage ein Fehler aufgetreten ist.

Ich bin mir sicher, dass es fast möglich ist, einen Einzeiler dafür zu schreiben, aber ich sehe nicht den richtigen Weg. Irgendwelche Trinkgeld?

+0

'(. \ [DEBUG \] *) \ {3} \]' –

+0

Oder vielleicht diese: '(. * - (?! \ [Aktualisiert). *)' –

+0

Nicht sicher, Ihre Kommentare zu verstehen ... – user3341592

Antwort

1

Angenommen, wir Updated erwarten jede geradzahlige Zeile,

awk 'NR%2==0{if (!/Updated/) print a} {a=$0}' log 

Ein allgemeineres ein.

awk 'NR>1{if (!/Updated/ && a ~ /INSERT|UPDATE|DELETE/) print a} {a=$0}' log 
+0

Die erste Annahme war falsch, wie Sie es sich vorgestellt haben. – user3341592

+0

Zweites funktioniert gut bei gegebenem MWE. Wie kannst du so umgekehrt denken ('NR> 1' und' $ 0' einer Variablen zuweisen, die die * vorherige * Zeile enthält? ;-) – user3341592

+0

Obwohl ich nicht verstehe wieso funktioniert das bei meinem echten, große Datei, in der alle Anfragen erfolgreich waren, aber wo ich 'XXX' in die'aktualisierte' Zeichenfolge eingefügt habe (wie' UpdXXXated'), um "SQL-Fehler" zu erzeugen, die von Ihrem Einzeiler abgefangen würden. Irgendeine Idee? – user3341592

0

Abhängig von regex Geschmack, aber

/\[DEBUG\]\[[\d\- :,]+\]\[DbConn\] - \[ *(?:INSERT|UPDATE|DELETE)(?!.*\n\[DEBUG\]\[[\d- :,]+\]\[DbConn\] - \[Updated:).*/g 

funktionieren sollte. Siehe demo.

+0

Wie müsste das in einem Shell-Skript verwendet werden? Über 'grep',' awk' oder etwas anderes (bitte kein Perl noch PHP oder Python ...)? – user3341592

+0

Oh, du kannst nicht. Sie unterstützen Lookahead nicht. – horcrux

Verwandte Themen