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

时间:2015-12-01 11:10:38

标签: aws-cli amazon-cloudwatch

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

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

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

12 个答案:

答案 0 :(得分:57)

我对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非常棒,因为输出易于读取,您可以从整个日志组中流式传输日志,而不仅仅是组中的单个流。过滤和观看具有特定前缀的流也同样容易!

答案 1 :(得分:23)

查看awslogs

如果您正好使用Lambda / API Gateway,请查看apilogs

答案 2 :(得分:7)

我刚发现cwtail并且效果很好(观看lambda函数的CloudWatch日志)。

安装:

npm install -g cwtail

列出日志组:

cwtail -l

然后,一旦你选择了哪个日志组为'tail':

cwtail -f /aws/lambda/ExampleFunction

答案 3 :(得分:6)

由于CloudWatch日志可以延迟(即不是通过精确定义“实时”),您可以解析上一个时间戳的先前事件并在那里开始下一次迭代:

#!/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 --output text logs get-log-events --log-group-name "$group_name" --log-stream-name "$stream_name" --start-time $start_time )
  [ $? -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

或者,如果要拖尾整个日志组,请使用不带流名称的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 --output text logs filter-log-events --log-group-name "$group_name" --interleaved --start-time $start_time )
  [ $? -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 gists的脚本:https://gist.github.com/tekwiz/964a3a8d2d84ff4c8b5288d9a703fbce

警告:以上代码&amp;脚本是为我的macOS系统编写的,它是使用Homebrew和GNU coreutils定制的(bastardized ??),因此可能需要为您的系统调整一些命令选项。欢迎编辑:)

答案 4 :(得分:4)

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

答案 5 :(得分:4)

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

答案 6 :(得分:3)

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

它非常易于安装(支持brew,snap和scoop),速度快(针对特定的硬件体系结构,没有中间运行时),并且具有一组features,使生活更轻松。

您使用cw的示例为:

cw tail -f groupName:streamName

答案 7 :(得分:1)

您可以使用awslogs,这是一个Python软件包,用于尾随aws logwatch日志。

使用

安装
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的更多信息,请参见project readme

答案 8 :(得分:1)

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

aws logs tail $group_name --follow

要安装v2版本,请参阅此page上的说明。它是在此PR中实现的。要在上次re:Invent会议上演示它,请参阅此video

除了跟踪日志外,它还允许使用--since参数将日志查看回指定时间,该参数可能花费绝对时间或相对时间

aws logs tail $group_name --since 5d

为了使awscli的v1和v2版本分开,我将awscli v2安装到单独的python虚拟环境中,并且仅在需要使用awscli v2时才将其激活。

答案 9 :(得分:0)

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

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

我想要一个非常快速,简单的日志查看器,使我可以立即轻松地查看应用程序错误和状态。 CloudWatch日志查看器运行缓慢,对于一些非常基本的查询,CloudWatch Insights可能花费> 1m。

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

答案 10 :(得分:0)

这是您可以使用的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获取的查询结果将随着每个添加的日志项而变得越来越大。不过,可以快速运行。

答案 11 :(得分:-1)

这当前不是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,并且可能有更好的方法以毫秒为单位获取时间。