mysql - Logstash Grok 模式解析 mysql 查询

标签 mysql regex logstash logstash-grok

我在logstash中有mysql慢日志,我想知道是否有人有幸解析查询部分以尝试对语句进行分类。我现在陷入困境,试图按大写字母的单词拆分查询。我想我至少可以分开最初的陈述。具体问题是:如何过滤这样的消息,以便至少可以处理按大写字母单词分割的查询的每个部分?

所以这个:

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

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

最佳答案

正如 Wiktor 的回复。您不应该依赖正则表达式来执行此类 SQL 查询。但如果每次都有一些重复的固定模式,则可以完成基于 grok 的解析。 对于您的示例语句,假设该语句以 SELECT 开头,并且有 2 个 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 ..."
        ]
      ]
    }

关于mysql - Logstash Grok 模式解析 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38490080/

相关文章:

c# - 正则表达式匹配没有部分的所有文本

elasticsearch - Kibana Elasticsearch 6.4基本安全性

java - 是否可以直接从jvm应用程序登录到Logstash?

MySql - Innodb - 损坏的索引/外键

php - 谷歌爬取mysql数据库

mysql - 根据当前日期对即将到来的生日进行排序

javascript - sublimeLinter - jshint 关于正则表达式字符串中的 "unnecessary escaping"的警告

mysql - SQL查询使用count时返回0

javascript - 解析两个元素之间的值

elasticsearch - Logstash 和 Elastic 升级