vic*_*orx 38 amazon-web-services amazon-cloudwatch
我已设法使用AWS CloudWatch日志代理将我的应用程序日志推送到AWS Cloudwatch.但ColudWatch Web控制台似乎没有提供允许您从中下载/导出日志数据的按钮.
我有什么想法可以实现这个目标?
Gus*_*uss 58
最新的AWS CLI具有CloudWatch Logs cli,允许您将日志下载为JSON,文本文件或AWS CLI支持的任何其他输出.
例如,要将a组中的流中的前10,000个日志条目获取A到文本文件,请运行:
aws logs get-log-events \
--log-group-name A --log-stream-name a \
--output text > a.log
Run Code Online (Sandbox Code Playgroud)
该命令目前限制为每个请求最多10,000条记录,如果您有更多,则需要使用该--next-token参数实现自己的页面步进机制.我希望将来CLI还允许在单个命令中进行完全转储.
这是一个小的Bash脚本,用于列出特定组中所有流的事件,因为指定的时间:
#!/bin/bash
function dumpstreams() {
aws $AWSARGS logs describe-log-streams \
--order-by LastEventTime --log-group-name $LOGGROUP \
--output text | while read -a st; do
[ "${st[4]}" -lt "$starttime" ] && continue
stname="${st[1]}"
echo ${stname##*:}
done | while read stream; do
aws $AWSARGS logs get-log-events \
--start-from-head --start-time $starttime \
--log-group-name $LOGGROUP --log-stream-name $stream --output text
done
}
AWSARGS="--profile myprofile --region us-east-1"
LOGGROUP="some-log-group"
TAIL=
starttime=$(date --date "-1 week" +%s)000
nexttime=$(date +%s)000
dumpstreams
if [ -n "$TAIL" ]; then
while true; do
starttime=$nexttime
nexttime=$(date +%s)000
sleep 1
dumpstreams
done
fi
Run Code Online (Sandbox Code Playgroud)
最后一部分,如果你设置TAIL将继续获取日志事件,并将报告更新的事件(有一些预期的延迟).
Jan*_*sky 28
还有一个名为python的项目awslogs,允许获取日志:https://github.com/jorgebastida/awslogs
有类似的东西:
列表日志组:
$ awslogs groups
Run Code Online (Sandbox Code Playgroud)
给定日志组的列表流:
$ awslogs streams /var/log/syslog
Run Code Online (Sandbox Code Playgroud)
从所有流中获取日志记录:
$ awslogs get /var/log/syslog
Run Code Online (Sandbox Code Playgroud)
从特定流中获取日志记录:
$ awslogs get /var/log/syslog stream_A
Run Code Online (Sandbox Code Playgroud)
等等(过滤时间段,观看日志流...
我想,这个工具可以帮助你做你想做的事.
Mik*_*Kay 17
其他答案对于 AWS Lambda 日志没有用,因为它们创建了许多日志流,而我只想转储上周的所有内容。我终于发现以下命令正是我所需要的:
aws logs tail --since 1w LOG_GROUP_NAME > output.log
Run Code Online (Sandbox Code Playgroud)
请注意,LOG_GROUP_NAME 是 lambda 函数路径(例如 /aws/lambda/FUNCTION_NAME),您可以用各种时间替换since 参数(1w = 1 周、5m = 5 分钟等)
Jos*_*ery 10
似乎AWS已添加将整个日志组导出到S3的功能.
您需要设置S3存储桶的权限,以允许cloudwatch通过在存储桶策略中添加以下内容来写入存储桶,将区域替换为您的区域,将存储桶名称替换为存储桶名称.
{
"Effect": "Allow",
"Principal": {
"Service": "logs.us-east-1.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::tsf-log-data"
},
{
"Effect": "Allow",
"Principal": {
"Service": "logs.us-east-1.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::tsf-log-data/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
Run Code Online (Sandbox Code Playgroud)
详细信息可以在本AWS文档的第2步中找到
我会添加一个衬垫来获取流的所有日志:
aws logs get-log-events --log-group-name my-log-group --log-stream-name my-log-stream | grep '"message":' | awk -F '"' '{ print $(NF-1) }' > my-log-group_my-log-stream.txt
Run Code Online (Sandbox Code Playgroud)
或者采用更易读的格式:
aws logs get-log-events \
--log-group-name my-log-group\
--log-stream-name my-log-stream \
| grep '"message":' \
| awk -F '"' '{ print $(NF-1) }' \
> my-log-group_my-log-stream.txt
Run Code Online (Sandbox Code Playgroud)
你可以用它制作一个方便的脚本,虽然它的功能不如@Guss 的强大,但足够简单。我将其保存为getLogs.sh并调用它./getLogs.sh log-group log-stream
#!/bin/bash
if [[ "${#}" != 2 ]]
then
echo "This script requires two arguments!"
echo
echo "Usage :"
echo "${0} <log-group-name> <log-stream-name>"
echo
echo "Example :"
echo "${0} my-log-group my-log-stream"
exit 1
fi
OUTPUT_FILE="${1}_${2}.log"
aws logs get-log-events \
--log-group-name "${1}"\
--log-stream-name "${2}" \
| grep '"message":' \
| awk -F '"' '{ print $(NF-1) }' \
> "${OUTPUT_FILE}"
echo "Logs stored in ${OUTPUT_FILE}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27307 次 |
| 最近记录: |