我在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/