我在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
或类似的东西可以让我进一步清理查询并使其可转换。
答案 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 ..."
]
]
}