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

问题描述 投票:33回答:9

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

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

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

aws-cli amazon-cloudwatch
9个回答
24
投票

看看awslogs

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


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


7
投票

我刚刚发现了cwtail并且运行良好(观看lambda函数的CloudWatch日志)。

安装:

npm install -g cwtail

列出日志组:

cwtail -l

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

cwtail -f /aws/lambda/ExampleFunction

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

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


4
投票

我创建了一个JetBrains plugin called awstail来做这个:)


3
投票

为了有效地关闭CloudWatch Logs,我创建了一个名为cw的工具。

它非常容易安装(它支持brew,snap和scoop),速度快(它针对特定的硬件架构,没有中间运行时),它有一套features,让生活更轻松。

你用cw的例子是:

cw tail -f groupName:streamName

1
投票

您可以使用awslogs,一个python包来拖尾日志。

安装它

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"

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


0
投票

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

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.