我可以使用以下命令查看日志。
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --limit 100
获取tail -f
等功能的命令是什么,以便我可以看到日志实时
答案 0 :(得分:57)
我对awslogs
和cwtail
感到非常失望,因此我创建了自己的工具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)
答案 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
。该脚本还采用了开始时间和结束时间的参数,分别默认为now
和2 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,并且可能有更好的方法以毫秒为单位获取时间。