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

how to view aws log real time (like tail -f)

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

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

获取tail -f等功能的命令是什么,以便我可以实时查看日志

这目前不是 CLI 的一项功能,因为它只是公开 CloudWatch Logs 的 HTTP API。您可以使用 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:]]+).+$// 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:]]+).+$// 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 系统编写的,该系统是使用 Homebrew 和 GNU coreutils 定制的(混蛋??),因此可能需要为您的系统调整一些命令选项。欢迎编辑:)

看看awslogs

如果您碰巧专门使用 Lambda/API 网关,请查看 apilogs

我刚刚发现 cwtail 它运行良好(查看 lambda 函数的 CloudWatch 日志)。

要安装:

npm install -g cwtail

要列出日志组:

cwtail -l

然后,一旦您选择了要 'tail' 的日志组:

cwtail -f /aws/lambda/ExampleFunction

我创建了一个 JetBrains plugin called awstail 来执行此操作:)

我对 awslogscwtail 感到非常失望,所以我制作了自己的名为 Saw 的工具,它可以有效地将 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 

Saw 很棒,因为输出易于阅读,并且您可以从整个日志组流式传输日志,而不仅仅是组中的单个流。过滤和观看带有特定前缀的流也同样简单!

您可以使用 awslogs,一个 python 包来跟踪 aws logwatch 日志。

安装

pip install awslogs

列出具有

的所有组
awslogs groups        

然后select一个流并用

观看
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"

有关使用 awslogs 的更多信息,请参阅 project readme

为了有效跟踪 CloudWatch Logs,我创建了一个名为 cw 的工具。

安装超级简单(支持 brew、snap 和 scoop),速度快(针对特定的硬件架构,没有中间运行时),并且有一组 features 让生活更轻松。

您使用 cw 的示例将是:

cw tail -f groupName:streamName

aws cli 不提供实时 tail -f 选项。

上面提到的那些其他工具确实提供了拖尾功能,但是, 我尝试了所有这些工具、awslogs、cwtail,但发现它们令人沮丧。它们下载事件的速度很慢,通常不可靠并且对显示 JSON 日志数据没有帮助,并且查询选项很原始。

我想要一个非常快速、简单的日志查看器,它可以让我立即轻松地查看应用程序错误和状态。 CloudWatch 日志查看器速度很慢,而 CloudWatch Insights 对于一些非常基本的查询可能需要 > 1m。

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

请注意,跟踪 aws 日志现在是官方 awscli 的一项支持功能,尽管仅在尚未发布的 awscli v2 中。拖尾和跟踪日志(如 tail -f)现在可以通过以下方式完成:

aws logs tail $group_name --follow

要安装 v2 版本,请参阅此 page. It was implemented in this PR. To see it demonstrated at the last re:Invent conference, see this video 上的说明。

除了跟踪日志之外,它还允许使用 --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=
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 获得的查询结果会随着每个添加的日志而不断变大物品。不过快 运行s 没问题。

AWS 现在允许您跟踪日志。就像 tail -f 一样。使用以下命令

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