业务基于 ruby on rails
用 sidekiq
做异步队列,运行在 N 台服务器,N > 1,没有专门的日志服务器。
业务定位问题,需要在 N 台机器的日志中搜索关键字,这样效率低。
将 N 台机器日志,合并到一台目标机器,在目标机器上面查看最终日志搜索结果,这样效率高。
假定有 3 台机器:A,B,C。
目标是在 A 上执行脚本,一键将 B,C 机器日志拉取到 A 机器。
在机器 A 上执行
# 将下面的值拷贝
more ~/.ssh/id_rsa.pub
在机器 B,C 上执行
# 将拷贝的值追加到 authorized_keys
vim ~/.ssh/authorized_keys
> /tmp/$1
for server in B-INNER-IP C-INNER-IP; do
# 注 B-INNER-IP 和 C-INNER-IP 是 B/C 服务器的内网IP地址
# deployer 是 B/C服务器的用户名 $1和$2 是执行脚本传入的第一,第二个参数, (date +%F) 是当天时间,比如: '2022-11-27'
# 以下语句: 远程ssh到B或C的指定目录, 在文件 $1中按关键字$2搜索今天的日志,追加到机器 A 的 /tmp/$1 目录
ssh -t deployer@$server 'cd /home/deployer/wai_mai/shared/log; more '$1' |grep "$(date +%F)" | grep '$2'' >> /tmp/$1
echo "##### 节点 $server 传输完成#####"
done
注 在 B,C 机器按关键字搜索后,再回传到机器 A,而不是将 B,C 机器整个日志传到 A,再在 A 上面进行搜索,这样可以大大降低网络传输。
将脚本命名为: merge_log.sh
,添加可执行权限
$ chmod 700 merge_log.sh
# 从机器 B,C上,找到今天在日志 `unicorn.stdout.log` 出现关键字 `588e6f3837b74dfdb827ba4d5e614645` 的所有日志,并存储到 A 机器的 /tmp/unicorn.stdout.log 文件中
./merge_log.sh unicorn.stdout.log 588e6f3837b74dfdb827ba4d5e614645
# 从机器 B,C上,找到今天在日志 `sidekiq.log` 出现关键字 `1100303332560786082` 的所有日志,并存储到 A 机器的 /tmp/sidekiq.log 文件中
./merge_log.sh sidekiq.log 1100303332560786082
目前的方式,对于机器都在一个内网中,整体执行效率较高。
如果大家有更加优雅的日志合并和查询的方案,也请留言。