logstash grok模式来解析mysql查询

时间:2016-07-20 20:16:44

标签: mysql regex logstash logstash-grok

我在logstash中有mysql slowlogs,我想知道是否有人运气解析查询部分以尝试对语句进行分类。我现在正试图用大写字母分隔查询。我认为我至少能分开最初的陈述。具体问题是:如何过滤这样的消息,这样我至少可以处理用大写字母分隔的查询的每个部分?

所以这个:

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 ...

将解析为:

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

或类似的东西可以让我进一步清理查询并使其可转换。

1 个答案:

答案 0 :(得分:0)

由Wiktor回复。您不应该依赖正则表达式进行此类SQL查询。但是如果每次都重复一些固定的模式,那么可以完成基于grok的解析。 对于您的示例语句,如果语句以SELECT开头并且有CONCAT后跟AS,则可以使用以下grok模式解析:

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

解析后的结果将与您要查找的结果相匹配 -

    {
      "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 ..."
        ]
      ]
    }