Wiktor回复的
我在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
或者类似的东西可以让我进一步清理查询并使其可索引。
。对于这样的sql查询,您不应该依赖regex。但是,如果每次都有一些固定的模式重复,则可以进行基于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 ..."
]
]
}