解析EB logs的一些Linux小命令
开启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 | $ ls *log1554688861.gz* |
Bucket下的日志,默认不会自动清理,日积月累,instance-id路径下的文件会越来越多,而目前aws cli的s3 cp或s3 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 | $ date -d @1554688861 |
date -d 'YYYY-MM-DDTHH:MM:SS' +%s,将字符形式的日期转为timestamp。
1 | $ date -d '2019-04-08T02:01:01' +%s |
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 |