如何使用 CLI 将日志发布到 Cloudwatch?

如何使用 CLI 将日志发布到 Cloudwatch?

我正在尝试创建一个 bash 脚本来检查网站的状态,我使用以下命令:

这个用于创建日志流

aws logs create-log-stream --log-group-name "WebsiteStatusMessage" --log-stream-name $timestamp

这是另一个发布日志

aws logs put-log-events --log-group-name "WebsiteStatusMessage" --log-stream-name "$timestamp" --log-events file://$iam/logsoutput.json

日志输出.json

 [ 
   { 
     "timestamp": 202006041832, 
     "message": "test event1" 
   } 
 ]

当我执行命令或脚本时,它会显示以下消息:

{
    "rejectedLogEventsInfo": {
        "tooOldLogEventEndIndex": 1
    }
}

控制台上还有另一条消息:

Expecting property name enclosed in double quotes: line 6 column 2 (char 84)

Bash 脚本代码

#!/bin/bash

#variables
iam=$(pwd)
timestamp=$(date +"%Y%m%d%H%M")
instance_id="i-######"

#Read line per line and storage it on a array
getArray()
{
array=()
  while IFS= read -r line
  do
       array+=("$line")
   done < "$1"
}
getArray "$iam/sites.txt"


#working
for url in "${array[@]}"
do
  echo "The website is: $url"
  STATUS=$(curl -s -o /dev/null -w "%{http_code}\n" $url)
    if [ "$STATUS" == "200" ] || [ "$STATUS" == "301" ] || [ "$STATUS" == "302" ]; then
        echo "$url is up, returned $STATUS"
    else
        echo "$url is not up, returned $STATUS"
###
# This will send the metric to metrics Cloudwatch
###

        rm $iam/metricsOutput.json
        echo " [ " >> $iam/metricsOutput.json
        echo " { " >> $iam/metricsOutput.json
        echo " \"MetricName\": \"SiteStatus\", " >> $iam/metricsOutput.json        
        echo " \"Timestamp\": \"$timestamp\", " >> $iam/metricsOutput.json
        echo " \"Value\": 1, " >> $iam/metricsOutput.json
        echo " } " >> $iam/metricsOutput.json
        echo " ] " >> $iam/metricsOutput.json


        aws cloudwatch put-metric-data --namespace "Custom-2" --metric-data file://$iam/metricsOutput.json


###
# This sends the message to logstream on Cloudwatch
###
        rm $iam/logsoutput.json
        echo " [ " >> $iam/logsoutput.json
        echo " { " >> $iam/logsoutput.json
        echo " \"timestamp\": $timestamp, " >> $iam/logsoutput.json
        echo " \"message\": \"test event1\" " >> $iam/logsoutput.json
        echo " } " >> $iam/logsoutput.json
        echo " ] " >> $iam/logsoutput.json

        aws logs create-log-stream --log-group-name "WebsiteStatusMessage" --log-stream-name $timestamp
        aws logs put-log-events --log-group-name "WebsiteStatusMessage" --log-stream-name "$timestamp" --log-events file://$iam/logsoutput.json


    fi
done

我尝试了不同的 json 结构,但仍然没有结果,有什么想法吗?(aws cli 具有完整的 cloudwatch 权限)

答案1

还没有测试过,但我认为timestamp应该是unix 时间戳(自 1970-01-01 00:00:00 以来的秒数)不是日期,即$(date +%s)很可能以毫秒为精度,因此附加000在末尾。

希望有帮助:)

答案2

1,您应该使用 Epoch 格式的时间。2. 时间应为 Epoch 格式的毫秒数,但是您在样本中给出的是秒数。 https://docs.aws.amazon.com/cli/latest/reference/logs/put-log-events.html

尝试这样的事情:

EPOCH_TIMESTAMP=$(($(date +%s)*1000))
aws logs put-log-events \
      --log-group-name "WebsiteStatusMessage" \
      --log-stream-name "$EPOCH_TIMESTAMP" \
      --log-events file://$iam/logsoutput.json

答案3

您应该设置一个以毫秒为单位的 Unix 时间时间戳。因此请在脚本中更改此设置。

timestamp=$(date +%s%3N)

答案4

我建议你将脚本的两个功能分开。你可以让脚本处理将日志输出到 .json 文件中,并在实例上安装 CloudWatch 代理。配置 CloudWatch 代理时,你可以告诉它包含你的自定义日志文件夹,它会将所有内容以干净的方式推送到 CloudWatch。由于粒度的原因,使用代理会产生一些小额费用,因此一定要查看其定价。与在 bash 脚本中使用 CLI 命令手动推送日志相比,这是一个更好的解决方案。如果有托管服务,请始终使用它 - 至少这是我的座右铭。

相关内容