在AWS CloudWatch Log Insights聚合双字段时按计数排序的问题
AWS CloudWatch Log Insights 查询问题:多字段聚合时为统计值设置别名
我尝试创建AWS CloudWatch Log Insights查询,提取Java日志中记录错误消息的前5个类。原查询能解析日志格式并按类统计错误数,但排序未按预期生效:
原查询:
fields @timestamp, @message, @logStream | parse @message '* * * [*][*:*] *' as date, time, logLevel, threadName, className, codeLineNumber, logMessage | filter logLevel == "ERROR" | stats count(*) by @logStream, className as errorsByClassName | sort errorsByClassName desc | limit 5
问题现象
- 预期输出:按
errorsByClassName降序排列,字段为@logStream、className、errorsByClassName
@logStream || className || errorsByClassName server2 || MyClass1 || 1000 server4 || MyOtherClass || 500 server1 || ARandomClass || 20
- 实际输出:
as被错误应用到className字段(重命名为errorsByClassName),统计值仍显示为count(*),且排序逻辑失效
@logStream || errorsByClassName || count(*) server4 || MyOtherClass || 500 server2 || MyClass1 || 1000 server1 || ARandomClass || 20
解决方案
问题出在stats语句的语法上:当需要为统计函数设置别名时,别名应紧跟在统计函数之后,而非by子句的字段后面。
修改后的stats语句为:
stats count(*) as errorsByClassName by @logStream, className
完整的正确查询:
fields @timestamp, @message, @logStream | parse @message '* * * [*][*:*] *' as date, time, logLevel, threadName, className, codeLineNumber, logMessage | filter logLevel == "ERROR" | stats count(*) as errorsByClassName by @logStream, className | sort errorsByClassName desc | limit 5
说明
- 原写法中
className as errorsByClassName是将className字段重命名为errorsByClassName,而非给count(*)设置别名,导致排序时找不到正确的统计字段 - 修改后,
count(*)被命名为errorsByClassName,by子句保留原字段@logStream和className,此时排序会基于正确的统计值降序排列,得到预期结果
内容的提问来源于stack exchange,提问作者Byob
相关产品推荐
相关产品推荐

