2016-07-20 7 views
0

Ich habe Mysql-Slowlogs in Logstash und ich frage mich, ob jemand Glück gehabt hat Parsing der Abfrage-Abschnitt zu versuchen und kategorisieren Aussagen. Ich bin gerade dabei, die Frage nach Wörtern in Großbuchstaben aufzuteilen. Ich denke, dass ich die erste Aussage zumindest trennen kann. Die spezifische Frage ist folgende: Wie kann ich eine Nachricht wie diese filtern, damit ich zumindest jeden Abschnitt der Anfrage mit Wörtern in Großbuchstaben aufteilen kann?Logstash grok Muster zu mysql Abfragen zu analysieren

So folgt aus:

SELECT column_one, column_two, COUNT(DISTINCT IF(column_three > 0, CONCAT('m_', column_three), CONCAT('r_', column_one))) AS tally FROM column_four WHERE ... 

würde in diese analysieren:

field1: SELECT column_one, column_two, 
field2: COUNT(DISTINCT IF(column_three > 0, 
field3: CONCAT('m_', column_three), 
field4: AS tally 
... etc 

oder etwas ähnliches, die mich weiter erlauben würde, die Abfrage zu reinigen und Wende zu machen.

+0

könnten Sie die Lexer verwenden, die mySQL verwendet [sql_lex.cc] (https://github.com/twitter/mysql/blob/master/sql/sql_lex.cc) –

+2

Wenn Sie beliebige sQL haben, nicht Verlasse dich auf Regex, benutze wirklich einen Parser. –

Antwort

0

wie von Wiktor geantwortet. Sie sollten sich nicht auf Regex für solche SQL-Abfragen verlassen. Aber wenn jedes Mal ein festes Muster wiederholt wird, kann Grok-basiertes Parsing durchgeführt werden. für Ihre Beispielrechnung, sagen, wenn die Anweisung mit SELECT beginnt und es gibt 2 CONCAT Gefolgt von AS kann es mit folgenden grok Muster analysiert werden:

(?<field_1>.+) (?<field_2>COUNT.+)(?<field_3>CONCAT.+)(?<field_4>CONCAT.+)(?<field_5>AS.+) 

Das analysierte Ergebnis wird den einen passen Sie for-

suchen
{ 
     "field_1": [ 
     [ 
      "SELECT column_one, column_two," 
     ] 
     ], 
     "field_2": [ 
     [ 
      "COUNT(DISTINCT IF(column_three > 0, " 
     ] 
     ], 
     "field_3": [ 
     [ 
      "CONCAT('m_', column_three), " 
     ] 
     ], 
     "field_4": [ 
     [ 
      "CONCAT('r_', column_one))) " 
     ] 
     ], 
     "field_5": [ 
     [ 
      "AS tally FROM column_four WHERE ..." 
     ] 
     ] 
    }