我已设法使用AWS CloudWatch日志代理将我的应用程序日志推送到AWS Cloudwatch。但ColudWatch Web控制台似乎没有提供允许您从中下载/导出日志数据的按钮。
我是如何实现这一目标的?
答案 0 :(得分:44)
最新的AWS CLI具有CloudWatch Logs cli,允许您将日志下载为JSON,文本文件或AWS CLI支持的任何其他输出。
例如,要将组a
中的流A
中的前10,000个日志条目获取到文本文件,请运行:
aws logs get-log-events \
--log-group-name A --log-stream-name a \
--output text > a.log
该命令目前限制为每个请求最多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
最后一部分,如果你设置TAIL
将继续获取日志事件,并会报告更新的事件(有一些预期的延迟)。
答案 1 :(得分:22)
还有一个名为awslogs
的python项目,允许获取日志:https://github.com/jorgebastida/awslogs
有类似的事情:
列出日志组:
$ awslogs groups
列出给定日志组的流:
$ awslogs streams /var/log/syslog
从所有流中获取日志记录:
$ awslogs get /var/log/syslog
从特定流中获取日志记录:
$ awslogs get /var/log/syslog stream_A
等等(过滤时间段,观看日志流......
我认为,这个工具可以帮助你做你想做的事。
答案 2 :(得分:6)
似乎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"
}
}
}
中找到
答案 3 :(得分:2)
显然,您无法从AWS Console下载CloudWatchLogs。也许您可以使用SDK / API编写脚本来执行CloudWatchLogs提取。
CloudWatchLogs的好处是你可以保留日志无限时间(永不过期);与CloudWatch不同,它只保留了14天的日志。这意味着您可以按月/季度频率运行脚本,而不是按需运行。
有关CloudWatchLogs API的更多信息, http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html http://awsdocs.s3.amazonaws.com/cloudwatchlogs/latest/cwl-api.pdf
答案 4 :(得分:0)
我会添加一个内联来获取流的所有日志:
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
或者采用稍微可读的格式:
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
你可以用它制作一个方便的剧本,这个剧本不如@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}"
答案 5 :(得分:0)
您现在可以使用新的Cloudwatch Logs Insights页面通过Cloudwatch管理控制台执行导出。 https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_ExportQueryResults.html处的完整文档。我已经开始使用JSON将Apache登录信息导入Cloudwatch,因此,如果您尚未预先设置,则使用YMMV。
将查询添加到仪表板或导出查询结果
运行查询后,可以将查询添加到CloudWatch 仪表板,或将结果复制到剪贴板。
添加到仪表板的查询在每次加载时自动重新运行 仪表板以及每次刷新仪表板。这些 查询计入四个并发CloudWatch Logs的限制 见解查询。
要将查询结果添加到仪表板
在以下位置打开CloudWatch控制台 https://console.aws.amazon.com/cloudwatch/。
在导航窗格中,选择“见解”。
选择一个或多个日志组并运行查询。
选择添加到仪表板。
选择仪表板,或选择“新建”以创建新的仪表板 查询结果。
选择添加到仪表板。
要将查询结果复制到剪贴板
在以下位置打开CloudWatch控制台 https://console.aws.amazon.com/cloudwatch/。
在导航窗格中,选择“见解”。
选择一个或多个日志组并运行查询。
选择操作,复制查询结果。
答案 6 :(得分:0)
我发现AWS文档是完整且准确的。 https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/S3ExportTasks.html 这为将日志从Cloudwatch导出到S3奠定了步骤
答案 7 :(得分:0)
适应了@OS的macOS答案。因为我不是一个真正的bash家伙,所以不得不使用python将日期转换为人类可读的格式。
WHERE status = '1'
AND Type = 'P'
AND id IN ('O10', 'OM1', 'OM6')
上周开始,依此类推
runaswslog -1w
awslogs.sh:
runawslog() { sh awslogs.sh $1 | grep "EVENTS" | python parselogline.py; }
parselogline.py:
#!/bin/bash
#set -x
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=""
#AWSARGS="--profile myprofile --region us-east-1"
LOGGROUP="/aws/lambda/StockTrackFunc"
TAIL=
FROMDAT=$1
starttime=$(date -v ${FROMDAT} +%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