AWS Cloudwatch日志 - 是否可以从中导出现有日志数据?

问题描述 投票:34回答:5

我已设法使用AWS CloudWatch日志代理将我的应用程序日志推送到AWS Cloudwatch。但ColudWatch Web控制台似乎没有提供允许您从中下载/导出日志数据的按钮。

我有什么想法可以实现这个目标?

amazon-web-services amazon-cloudwatch
5个回答
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将继续获取日志事件,并将报告更新的事件(有一些预期的延迟)。


24
投票

还有一个名为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

等等(过滤时间段,观看日志流...

我想,这个工具可以帮助你做你想做的事。


7
投票

似乎AWS已添加将整个日志组导出到S3的功能。

Export to S3 menu

Export to S3 Form

您需要设置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"
            }
        }
    }

详细信息可以在Step 2 of this AWS doc找到


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


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}"
© www.soinside.com 2019 - 2024. All rights reserved.