示例查询
本部分包含常用的查询命令列表,您可以在 CloudWatch 控制台
常规查询
查找 25 个最近添加的日志事件。
fields @timestamp, @message | sort @timestamp desc | limit 25
获得每小时异常数量的列表。
filter @message like /Exception/ | stats count(*) as exceptionCount by bin(1h) | sort exceptionCount desc
获取并非异常的日志事件的列表。
fields @message | filter @message not like /Exception/
Lambda 日志的查询
确定超额配置的内存量。
filter @type = "REPORT" | stats max(@memorySize / 1000 / 1000) as provisonedMemoryMB, min(@maxMemoryUsed / 1000 / 1000) as smallestMemoryRequestMB, avg(@maxMemoryUsed / 1000 / 1000) as avgMemoryUsedMB, max(@maxMemoryUsed / 1000 / 1000) as maxMemoryUsedMB, provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB
创建延迟报告。
filter @type = "REPORT" | stats avg(@duration), max(@duration), min(@duration) by bin(5m)
Amazon VPC 流日志的查询
查找跨主机的前 15 个数据包传输:
stats sum(packets) as packetsTransferred by srcAddr, dstAddr | sort packetsTransferred desc | limit 15
查找给定子网上传输字节数最多的 15 个主机。
filter isIpv4InSubnet(srcAddr, "192.0.2.0/24") | stats sum(bytes) as bytesTransferred by dstAddr | sort bytesTransferred desc | limit 15
查找使用 UDP 作为数据传输协议的 IP 地址。
filter protocol=17 | stats count(*) by srcAddr
在捕获时段内查找跳过流记录的 IP 地址。
filter logStatus="SKIPDATA" | stats count(*) by bin(1h) as t | sort t
Route 53 日志的查询
查找每小时每种查询类型的记录分布。
stats count(*) by queryType, bin(1h)
查找具有最高请求数的 10 个 DNS 解析程序。
stats count(*) as numRequests by resolverIp | sort numRequests desc | limit 10
按服务器未能完成 DNS 请求的域和子域查找记录数。
filter responseCode="SERVFAIL" | stats count(*) by queryName
CloudTrail 日志的查询
查找每项服务、事件类型和Amazon区域的日志条目数。
stats count(*) by eventSource, eventName, awsRegion
查找给定Amazon区域中已启动或已停止的 Amazon EC2 主机。
filter (eventName="StartInstances" or eventName="StopInstances") and awsRegion="us-east-2"
查找新建的 IAM 用户的Amazon区域、用户名和 ARN。
filter eventName="CreateUser" | fields awsRegion, requestParameters.userName, responseElements.user.arn
查找在调用 API UpdateTrail
时发生异常的记录数。
filter eventName="UpdateTrail" and ispresent(errorCode) | stats count(*) by errorCode, errorMessage
查找使用 TLS 1.0 或 1.1 的日志条目
filter tlsDetails.tlsVersion in [ "TLSv1", "TLSv1.1" ] | stats count(*) as numOutdatedTlsCalls by userIdentity.accountId, recipientAccountId, eventSource, eventName, awsRegion, tlsDetails.tlsVersion, tlsDetails.cipherSuite, userAgent | sort eventSource, eventName, awsRegion, tlsDetails.tlsVersion
查找使用 TLS 1.0 或 1.1 的服务调用数
filter tlsDetails.tlsVersion in [ "TLSv1", "TLSv1.1" ] | stats count(*) as numOutdatedTlsCalls by eventSource | sort numOutdatedTlsCalls desc
NAT 网关的查询
如果您注意到您的 Amazon 帐单高于正常成本,则可以使用 CloudWatch Logs Insights 查找主要耗用项。有关以下查询命令的更多信息,请参阅 Amazon 高级支持页面中的如何在我的 VPC 中找到通过 NAT 网关的主要流量耗用项?
查找通过 NAT 网关发送流量最多的实例。
注意
在以下查询命令中,将 "x.x.x.x" 替换为 NAT 网关的私有 IP,然后用 VPC CIDR 范围的前两个八位字节替换 "y.y"。
filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
确定 NAT 网关中进出实例的流量。
filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') or (srcAddr like 'xxx.xx.xx.xx' and dstAddr like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
确定 VPC 中实例最常与之进行上载和下载的互联网目标。
对于上载
filter (srcAddr like 'x.x.x.x' and dstAddr not like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
对于下载
filter (dstAddr like 'x.x.x.x' and srcAddr not like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
查询 Apache 服务器日志
您可以使用 CloudWatch Logs Insights 查询 Apache 服务器日志。有关以下查询的更多信息,请参阅 Amazon 云运营与迁移博客中的使用 CloudWatch Logs Insights 简化 Apache 服务器日志
找到最相关的字段,以便您可以在应用程序的 /admin 路径中审阅访问日志和查看流量。
fields @timestamp, remoteIP, request, status, filename| sort @timestamp desc | filter filename="/var/www/html/admin" | limit 20
使用状态代码 "200"(成功)查找访问主页的唯一 GET 请求数量。
fields @timestamp, remoteIP, method, status | filter status="200" and referrer= http://34.250.27.141/ and method= "GET" | stats count_distinct(remoteIP) as UniqueVisits | limit 10
查找 Apache 服务重新启动的次数。
fields @timestamp, function, process, message | filter message like "resuming normal operations" | sort @timestamp desc | limit 20
解析命令的示例
使用 glob 表达式来从日志字段 @message
提取临时字段 @user
、@method
和 @latency
,并对于 @method
和 @user
的每个唯一组合返回平均延迟。
parse @message "user=*, method:*, latency := *" as @user, @method, @latency | stats avg(@latency) by @method, @user
使用正则表达式来从日志字段 @message
提取临时字段 @user2
、@method2
和 @latency2
,并对于 @method2
和 @user2
的每个唯一组合返回平均延迟。
parse @message /user=(?<user2>.*?), method:(?<method2>.*?), latency := (?<latency2>.*?)/ | stats avg(latency2) by @method2, @user2
提取临时字段 loggingTime
、loggingType
和 loggingMessage
,筛选出包含 ERROR
或 INFO
字符串的日志记录,然后仅显示包含 ERROR
字符串的事件的 loggingMessage
和 loggingType
字段。
FIELDS @message | PARSE @message "* [*] *" as loggingTime, loggingType, loggingMessage | FILTER loggingType IN ["ERROR", "INFO"] | DISPLAY loggingMessage, loggingType = "ERROR" as isError