如何实时查看 aws 日志(如 tail-f)

我可以使用以下命令查看日志。

aws logs get-log-events --log-group-name groupName --log-stream-name streamName --limit 100

什么是命令来获得像 tail -f这样的功能,以便我可以看到日志的实时性

79649 次浏览

目前这不是 CLI 的一个特性,因为它只是为 CloudWatch 日志公开了 HTTPAPI。您可以使用一个 shell 脚本来模拟这个功能:

#! /bin/sh


end_time=$(($(date +"%s") * 1000))
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --end-time $end_time


while :
do
start_time=$end_time
end_time=$(($(date +"%s") * 1000))
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --start-time $start_time --end-time $end_time
sleep 1
done

免责声明: 这在 Windows 上不起作用,可能有一个更好的方法来获得毫秒的时间。

因为 CloudWatch 日志可能会被延迟(即不是精确定义的“实时”) ,所以您需要解析上一个时间戳的前一个事件,并在那里开始下一个迭代。此脚本使用 aws logs get-log-events,必须为其指定有效的 stream_name

#!/bin/bash
    

group_name='<log-group-name>'
stream_name='<log-stream-name>'
start_seconds_ago=300


start_time=$(( ( $(date -u +"%s") - $start_seconds_ago ) * 1000 ))
while [[ -n "$start_time" ]]; do
loglines=$(aws logs get-log-events --log-group-name "$group_name" --log-stream-name "$stream_name" --start-time $start_time --output text)
[ $? -ne 0 ] && break
next_start_time=$( sed -nE 's/^EVENTS.([[:digit:]]+).+$/\1/ p' <<< "$loglines" | tail -n1 )
[ -n "$next_start_time" ] && start_time=$(( $next_start_time + 1 ))
echo "$loglines"
sleep 15
done

或者,如果希望跟踪整个日志组,则此脚本使用没有流名称的 aws logs filter-log-events:

#!/bin/bash


group_name='<log-group-name>'
start_seconds_ago=300
  

start_time=$(( ( $(date -u +"%s") - $start_seconds_ago ) * 1000 ))
while [[ -n "$start_time" ]]; do
loglines=$(aws logs filter-log-events --log-group-name "$group_name" --interleaved --start-time $start_time --output text)
[ $? -ne 0 ] && break
next_start_time=$( sed -nE 's/^EVENTS.([^[:blank:]]+).([[:digit:]]+).+$/\2/ p' <<< "$loglines" | tail -n1 )
[ -n "$next_start_time" ] && start_time=$(( $next_start_time + 1 ))
echo "$loglines"
sleep 15
done

我还提供了用作 GitHub 要点的脚本: https://gist.github.com/tekwiz/964a3a8d2d84ff4c8b5288d9a703fbce

警告: 上面的代码和脚本是为我的 MacOS 系统编写的,这是定制的(私生子? ?)因此,一些命令选项可能需要为您的系统进行调整。欢迎编辑:)

看看 Awslog

如果您正好使用的是 Lambda/API 网关,那么可以看一下 阿皮罗格斯

我刚刚发现了 鸡尾酒,它工作得很好(可以查看 lambda 函数的 CloudWatch 日志)。

安装:

npm install -g cwtail

列出日志组:

cwtail -l

然后,一旦你选择了“跟踪”哪个日志组:

cwtail -f /aws/lambda/ExampleFunction

为此,我创建了一个 JetBrains 叫做 awstail 的插件:)

我对 awslogscwtail非常失望,所以我自己开发了一个名为 锯子的工具,它可以有效地将 CloudWatch 日志流传输到控制台(并为 JSON 输出着色) :

你可以通过以下方式在 MacOS 上安装:

brew tap TylerBrock/saw
brew install saw

它有很多很好的特性,比如能够自动展开(缩进) JSON 输出(尝试使用 --expand运行该工具) :

saw watch my_log_group --expand

有想要查看错误日志的 Lambda 吗? 没问题:

saw watch /aws/lambda/my_func --filter error

锯是伟大的,因为输出很容易阅读,您可以流日志从整个日志组,而不只是一个单一的流在组。过滤和观看带有特定前缀的流也同样容易!

您可以使用 Awslog,一个 python 包来跟踪 awslogwatch 日志。

安装它

pip install awslogs

列出所有具有

awslogs groups

然后选择一条流,用

awslogs get staging-cluster --watch

还可以使用匹配的模式筛选日志。

# tail logs of a cluster
awslogs get staging-cluster --watch


# tail logs of a lambda function
awslogs get /aws/lambda/some-service --watch


# print all logs containg "error"
awslogs get staging-cluster --watch --filter-pattern="error"


# print all logs *not* containg "error"
awslogs get staging-cluster --watch --filter-pattern="-error"

有关使用 awslog 的更多信息,请参见 自述项目

为了有效地跟踪 CloudWatch 日志,我创建了一个名为 CW的工具。

它非常容易安装(它支持酿造,管理和勺) ,快速(它的目标是特定的硬件架构,没有中间运行时) ,它有一套 特征,使生活更容易。

CW的例子是:

cw tail -f groupName:streamName

Aws cli 不提供 live tail-f 选项。

然而,上面提到的其他工具确实提供了尾随特性, 我尝试了所有这些工具,awslog,cwtail,发现他们令人沮丧。它们下载事件的速度很慢,通常不可靠,对显示 JSON 日志数据没有帮助,而且查询选项也很简单。

我想要一个非常快速,简单的日志查看器,使我能够即时和容易地看到应用程序的错误和状态。CloudWatch 日志查看器速度很慢,对于一些非常基本的查询,CloudWatch Insights 可能需要超过100万次。

因此,我创建了 SenseLogs,这是一个完全在浏览器中运行的免费 AWS CloudWatch Logs 查看器。不需要服务器端服务。SenseLogs 透明地下载日志数据,并将事件存储在浏览器应用程序缓存中,以便立即查看、平滑无限滚动和全文查询。SenseLogs 具有无限反向滚动的活动尾巴。详情请参阅 https://github.com/sensedeep/senselogs/blob/master/README.md

请注意,跟踪 awscli 日志现在是官方 awscli 的一个支持特性,尽管只在 awscli v2中,该特性尚未发布。跟踪和跟踪日志(如 tail -f)现在可以通过以下方法完成:

aws logs tail $group_name --follow

要安装 v2版本,请参阅 呼叫上的说明。它是在这个 公关中实现的。要在最后的 re: Invent 会议上看到它的演示,请参见这个 视频

除了跟踪日志之外,它还允许使用 --since参数将日志查看回指定的时间,这可能需要一个绝对或相对时间

aws logs tail $group_name --since 5d

为了将 awscli 的 v1和 v2版本分开,我将 awscli v2安装到一个单独的 python 虚拟环境中,只有在需要使用 awscli v2时才激活它。

这里有一个 bash 脚本,您可以使用它,它需要 AWS CLI 和 JQ

#!/bin/bash


# Bail out if anything fails, or if we do not have the required variables set
set -o errexit -o nounset


LOG_GROUP_NAME=$1
LOG_BEGIN=$(date --date "${2-now}" +%s)
LOG_END=$(date --date "${3-2 minutes}" +%s)
LOG_INTERVAL=5
LOG_EVENTIDS='[]'


while (( $(date +%s) < $LOG_END + $LOG_INTERVAL )); do
sleep $LOG_INTERVAL
LOG_EVENTS=$(aws logs filter-log-events --log-group-name $LOG_GROUP_NAME --start-time "${LOG_BEGIN}000" --end-time "${LOG_END}000" --output json)
echo "$LOG_EVENTS" | jq -rM --argjson eventIds "$LOG_EVENTIDS" '.events[] as $event | select($eventIds | contains([$event.eventId]) | not) | $event | "\(.timestamp / 1000 | todateiso8601) \(.message)"'
LOG_EVENTIDS=$(echo "$LOG_EVENTS" | jq -crM --argjson eventIds "$LOG_EVENTIDS" '$eventIds + [.events[].eventId] | unique')
done

使用方法: 保存文件,chmod +x它,然后运行它: ./cloudwatch-logs-tail.sh log-group-name。该脚本还接受开始时间和结束时间的参数,这两个时间分别默认为 now2 minutes。您可以指定 date --date可以为这些参数解析的任何字符串。

它是如何工作的: 脚本保留一个已显示的事件 ID 列表,这个列表从一开始就是空的。它查询 CloudWatch Logs 以获取指定时间间隔内的所有日志项,并显示与事件 ID 列表不匹配的日志项。它保存下一次迭代的所有事件 ID。

该脚本每隔几秒轮询一次(由脚本中的 LOG_INTERVAL设置) ,并在结束时间之后再轮询一次,以解释日志摄入和可用性之间的延迟。

请注意,如果您希望一次跟踪日志超过几分钟,那么这个脚本不会很好,因为它从 AWS 获得的查询结果将随着每个添加的日志项而不断变大。不过跑得快还是可以的。

AWS 现在允许您跟踪日志

aws logs tail <log group name> --follow

例如,如果你正在使用应用程序名称为 myapp-prd的 ElasticBeanStalk,并且想要跟踪 web1.log,那么它将是

aws logs tail /aws/elasticbeanstalk/myapp-prd/var/log/web-1.log --follow

在检查了许多选项并测试了一些自定义工具后,aws logs tail对我来说效果最好。

这里有一个简单的示例命令:

aws logs tail <GROUP_NAME> --follow

这是一份非常有用的官方文件:

Https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/tail.html