我正在尝试创建一个 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 命令手动推送日志相比,这是一个更好的解决方案。如果有托管服务,请始终使用它 - 至少这是我的座右铭。