CloudWatch 日志与日志洞察
将 EC2、Lambda 和容器的日志汇总到日志组中,并运行 CloudWatch Logs Insights 查询以查找错误和模式
CloudWatch 日志与日志洞察 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
CloudWatch Logs 概述
Amazon CloudWatch Logs 是一项完全托管的日志聚合服务,可收集、存储和分析来自 AWS 服务及您自己的应用程序的日志数据。传统日志管理通常需要通过 SSH 连接到服务器来读取文件,而 CloudWatch Logs 则将所有日志集中存储在持久且加密的存储中,并内置查询、筛选、指标提取和保留期管理功能。它原生集成 EC2、Lambda、ECS、EKS、API Gateway、CloudTrail 和 VPC Flow Logs。
日志组和日志流
日志按层次结构组织:日志组是用于存放具有相同保留期和访问控制设置的日志的命名容器(例如 /aws/lambda/my-function)。在日志组中,每个日志流代表一个连续日志事件来源 — 一个 EC2 实例、一个 Lambda 容器或一个 ECS 任务。一个日志组可以包含数千个日志流,但每个日志流只能属于一个日志组。
# Create a log group with 30-day retention
aws logs create-log-group \
--log-group-name /myapp/production/api
aws logs put-retention-policy \
--log-group-name /myapp/production/api \
--retention-in-days 30
# List log streams in a group
aws logs describe-log-streams \
--log-group-name /myapp/production/api \
--order-by LastEventTime \
--descending从 Lambda 和 EC2 发送日志
AWS Lambda 会自动将所有 stdout 和 stderr 输出发送到 CloudWatch Logs — 您只需让 Lambda 执行角色包含 logs:CreateLogGroup、logs:CreateLogStream 和 logs:PutLogEvents。对于 EC2 实例,您需要安装 CloudWatch Agent,并配置要持续读取的日志文件(例如 /var/log/nginx/access.log)、写入的日志组,以及用于识别单条日志记录的模式。
# CloudWatch Agent config for tailing an application log file
# /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
# {
# "logs": {
# "logs_collected": {
# "files": {
# "collect_list": [{
# "file_path": "/var/log/myapp/app.log",
# "log_group_name": "/myapp/production/api",
# "log_stream_name": "{instance_id}",
# "timestamp_format": "%Y-%m-%dT%H:%M:%S"
# }]
# }
# }
# }
# }CloudWatch Logs Insights
CloudWatch Logs Insights 是一个交互式查询引擎,可让您使用专用查询语言搜索和分析日志数据。您可以跨一个或多个日志组运行查询,按时间范围筛选,从结构化或非结构化日志行中提取字段,聚合数据,并将结果以条形图或时间序列的形式可视化。查询按需运行,并按扫描的数据量(每 GB)收费 — 将日志结构化为 JSON 可显著减少扫描量。
# Find the top 10 slowest Lambda invocations in the last hour
aws logs start-query \
--log-group-name /aws/lambda/my-function \
--start-time $(date -d '1 hour ago' +%s) \
--end-time $(date +%s) \
--query-string 'filter @type = "REPORT"
| fields @requestId, @duration
| sort @duration desc
| limit 10'Logs Insights 查询语言
Logs Insights 查询语言使用以管道符分隔的命令:fields 用于选择要显示的字段,filter 用于缩小事件范围(支持通过 like 和 =~ 使用正则表达式),stats 用于聚合数据,sort 用于排序结果,limit 用于限制结果数量。该服务会自动发现 JSON 格式日志行中的字段。对于非结构化日志,您可以使用带有 glob 或正则表达式模式的 parse 来解析值。
# Count errors by status code in the last 24 hours
fields @timestamp, @message
| filter @message like /ERROR/
| parse @message '* * * [*] "* *" * *' as host, user, datetime, request, method, status, bytes
| stats count(*) as errorCount by status
| sort errorCount desc
| limit 20指标筛选器:从日志到指标
指标筛选器会持续扫描传入的日志事件以查找模式,每发现一次匹配,就会递增一个自定义 CloudWatch 指标。例如,您可以在 Lambda 日志组上创建指标筛选器,每当日志行包含 ERROR 时,就递增 ErrorCount 指标。然后,您可以在该指标上创建 CloudWatch alarm 来通知团队。这样无需将结果存储在单独的数据库中,就能把日志转换为可执行的指标。
# Create a metric filter that counts ERROR lines
aws logs put-metric-filter \
--log-group-name /myapp/production/api \
--filter-name ErrorCount \
--filter-pattern 'ERROR' \
--metric-transformations \
metricName=ApplicationErrors,metricNamespace=MyApp,metricValue=1,defaultValue=0
# Now create an alarm on the resulting metric
aws cloudwatch put-metric-alarm \
--alarm-name HighErrorRate \
--metric-name ApplicationErrors \
--namespace MyApp \
--statistic Sum \
--period 60 \
--evaluation-periods 1 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--alarm-actions arn:aws:sns:us-east-1:111122223333:Ops日志订阅和流式传输
订阅筛选器会将日志事件近乎实时地流式传输到其他服务,以进行处理或存储。您可以将日志流式传输到 AWS Lambda(用于转换和路由日志)、Amazon Kinesis Data Streams(用于高容量日志处理)或 Amazon Kinesis Firehose(用于交付到 S3、OpenSearch 或 Splunk)。每个日志组最多支持两个订阅筛选器。跨账户日志流式传输需要使用具有适当资源策略的目标。
# Stream all logs containing ERROR to a Kinesis Firehose for S3 archiving
aws logs put-subscription-filter \
--log-group-name /myapp/production/api \
--filter-name ErrorsToFirehose \
--filter-pattern 'ERROR' \
--destination-arn arn:aws:firehose:us-east-1:111122223333:deliverystream/LogArchive \
--distribution 'ByLogStreamName'保留策略和成本管理
默认情况下,CloudWatch Logs 会永久存储数据,这可能导致高昂费用。请为每个日志组设置保留策略,以自动删除旧日志事件。常见的保留期限包括:调试日志 7 天、应用程序日志 30 天、审计日志 1–5 年。您可以使用 create-export-task API 将日志组导出到 S3,以便长期、低成本地存档,但导出属于批处理操作,并非实时操作。
# Set retention on all log groups that have no retention policy
aws logs describe-log-groups \
--query 'logGroups[?!retentionInDays].logGroupName' \
--output text | tr '\t' '\n' | while read lg; do
aws logs put-retention-policy \
--log-group-name "$lg" \
--retention-in-days 90
echo "Set 90-day retention on $lg"
doneVPC Flow Logs
VPC Flow Logs会捕获流入和流出 VPC、子网或单个 ENI 的网络接口的 IP 流量元数据。它们可以存储在 CloudWatch Logs 或 S3 中。Flow logs 包含源 IP、目标 IP、端口、协议、数据包数量、字节数、操作(ACCEPT 或 REJECT)以及时间戳。它们对于排查安全组和 NACL 规则问题、检测端口扫描以及审计流量模式非常有价值 — 但不会捕获实际的数据包负载。
# Enable VPC Flow Logs to CloudWatch Logs
aws ec2 create-flow-logs \
--resource-ids vpc-0abc1234def567890 \
--resource-type VPC \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /aws/vpc/flow-logs \
--deliver-logs-permission-arn arn:aws:iam::111122223333:role/FlowLogsRole使用 Insights 查询 VPC Flow Logs
CloudWatch Logs Insights 对VPC Flow Log 分析尤其强大。您可以快速识别被拒绝的流量,按字节量找出流量最大的通信方,检测异常连接,或筛选出发往特定实例的流量。Flow log 格式默认以空格分隔,但以 JSON 格式发布到 CloudWatch Logs 后,Insights 查询就能自动提取字段。
# Find top 10 source IPs by rejected byte volume in the last day
fields srcAddr, dstAddr, dstPort, action, bytes
| filter action = 'REJECT'
| stats sum(bytes) as rejectedBytes by srcAddr
| sort rejectedBytes desc
| limit 10使用 KMS 加密日志
CloudWatch Logs 默认使用AWS 管理的密钥加密所有静态数据。为了增强安全性 — 尤其是在受监管环境中 — 您可以将客户管理的 KMS 密钥与日志组关联。这样您可以控制密钥轮换和访问权限,并可通过禁用密钥来撤销对所有日志数据的访问权限。KMS 密钥必须包含密钥策略,授予 CloudWatch Logs 使用该密钥进行加密和解密的权限。
# Associate a KMS key with a log group
aws logs associate-kms-key \
--log-group-name /myapp/production/api \
--kms-key-id arn:aws:kms:us-east-1:111122223333:key/KEY_ID
# Verify encryption is configured
aws logs describe-log-groups \
--log-group-name-prefix /myapp/production \
--query 'logGroups[].{Name:logGroupName,KmsKey:kmsKeyId}'快速检查
测试您对本课 AWS 解决方案架构师(SAA-C03)相关概念的理解。
课程回顾
本课介绍了:日志组和日志流可按来源整理日志,并可配置保留期;Logs Insights支持使用功能强大的管道式查询语言查询和聚合日志数据;指标筛选器可将日志模式转换为 CloudWatch 指标,并触发警报。接下来,我们将探索 CloudWatch 仪表板和 Container Insights,了解如何提升运维可见性。
常见问题解答
「CloudWatch 日志与日志洞察」课时是免费的吗?
是的 — 「CloudWatch 日志与日志洞察」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「CloudWatch 日志与日志洞察」这节课中我会学到什么?
将 EC2、Lambda 和容器的日志汇总到日志组中,并运行 CloudWatch Logs Insights 查询以查找错误和模式 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「CloudWatch 日志与日志洞察」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- CloudWatch 指标、命名空间与维度
- CloudWatch 警报与复合警报
- CloudWatch 日志与日志洞察
- CloudWatch 控制面板与容器洞察