开启EB rotated log功能后,EB的日志将会被存储在EB对应bucket的resources/environments/logs/logtype/environment-id/instance-id路径下, 供后续查看。官网文档Viewing Logs from Amazon EC2 Instances in Your Elastic Beanstalk Environment

下面记录几个常用检查日志的小命令

使用exclue和include来获取部分日志

开启EB的rotated log后,EB中的EC2会每小时将日志上传到S3中。以Passenger with Ruby的Platform为例,有production.log, access.log和passenger.log三种文件会被传到S3中,文件名格式:文件路径+时间戳+gz的格式

1
2
3
4
5
$ ls *log1554688861.gz*
_var_app_support_logs_rotated_access.log1554688861.gz
_var_app_support_logs_rotated_passenger.log1554688861.gz
_var_app_support_logs_rotated_production.log1554688861.gz
$

Bucket下的日志,默认不会自动清理,日积月累,instance-id路径下的文件会越来越多,而目前aws cli的s3 cps3 sync,并没有提供根据创建时间的filter,有时候获取固定哪段时间的文件就不太方便。

虽然aws cli没法直接精确地实现,但可以使用–exclude和–include参数,根据文件名字的命名规则来粗略地实现一下。
大概的命令如下:
aws s3 sync s3://${elasticbeanstalk-region-account-id}/resources/environments/logs/publish/${environment-id}/${instance-id}/ logs/ --exclude "*" --include "*log1554[01234567]*"

其中

  • elasticbeanstalk-region-account-id,environment-id,instance-id替换成实际环境的值
  • 首先使用–exclude “*”,不包含任何值
  • 再使用–include “*log1554[01234567]*“筛选出要的文件。include的匹配字串,需要根据实际时间和文件前缀进行修改。

日期的字符串形式和timestamp形式的转换, Linux下可以使用date命令来进行转换。

date -d "@$TIMESTAMP"来将timestamp转换为字符串形式,

1
2
3
$ date -d @1554688861
2019年 04月 08日 星期一 02:01:01 UTC
$

date -d 'YYYY-MM-DDTHH:MM:SS' +%s,将字符形式的日期转为timestamp。

1
2
3
$ date -d '2019-04-08T02:01:01' +%s
1554688861
$

Linux 小命令

过滤出access log中4XX的请求

1
zgrep ' 4[0-9][0-9] [0-9]' _var_app_support_logs_rotated_access.log1554*.gz > 4xx_in_i-09bb7607be9f0c928.txt

筛选出4XX日志中第一级前缀最多的url

1
cat 4xx_in_i-09bb7607be9f0c928.txt | awk '{print $6,$7}' | cut -d '/' -f 1,2 | sort | uniq -c | sort -n

筛选出4XX请求最密集的分钟数

1
cat 4xx_in_i-09bb7607be9f0c928.txt | awk '{print $4}' | cut -d ':' -f 1,2,3 | sort | uniq -c | sort -n

筛选出某分钟内所有的access 日志

1
zgrep '05/Apr/2019:00:42' _var_app_support_logs_rotated_access.log1554*.gz

Reference

留言