Linux Rails 多节点日志合并查询

luolinae86 · 2022年11月27日 · 最后由 luolinae86 回复于 2022年12月11日 · 778 次阅读

场景

业务基于 ruby on railssidekiq 做异步队列,运行在 N 台服务器,N > 1,没有专门的日志服务器。

业务定位问题,需要在 N 台机器的日志中搜索关键字,这样效率低。

解决方案

将 N 台机器日志,合并到一台目标机器,在目标机器上面查看最终日志搜索结果,这样效率高。

假定有 3 台机器:A,B,C。

目标是在 A 上执行脚本,一键将 B,C 机器日志拉取到 A 机器。

方法

1. 将服务器 A 公钥添加到 B,C 机器信任列表

在机器 A 上执行

# 将下面的值拷贝
more ~/.ssh/id_rsa.pub

在机器 B,C 上执行

# 将拷贝的值追加到 authorized_keys
vim ~/.ssh/authorized_keys 
2. 添加远程执行的脚本
> /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
3. 执行脚本
# 从机器 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

备注

目前的方式,对于机器都在一个内网中,整体执行效率较高。

如果大家有更加优雅的日志合并和查询的方案,也请留言。

那还是弄个 ELK 之类的日志系统好,输入查询条件把日志搜出来的感觉是日志文件做不到的。

我前一阵子看到一个观测云:https://www.guance.com/ ,可以从免费版开始,比 ELK 本地化做的好。

Rei 回复

谢谢 Rei 的建议,下一步专门搭建一个日志系统。

lyfi2003 回复

多谢大佬推荐,我同时也来看一下

低配机器做日志聚合要不要考虑一下 Loki

xinyifly 回复

感谢提供思路,我会仔细参考和对比一下。

  1. N 台机器,如何部署的,手动或者脚本?
  2. 我们用了 Aliyun 日志服务 SLS,直接把这个问题解了,成本可接受。分享的思路一定程度上能解当前问题,如果有扩展需求就不好解了,就是能解决一个问题但不能解一类问题。比如现在按关键词搜,如果需要按时间段筛选某段日志或者部分字段属性,可能就不好处理了。
wikimo 回复

是的,如你所说,在没有搭建日志服务的场景下,该方案,可以用 20% 的时间,解决 80% 的问题,也只适用于机器 N 不太多的场景。 最终还是得用专业的日志服务。

wikimo 回复

准备试试 K8S 了。还打算找你 i 交流一下。

我们是用 docker 部署服务 之前用 rancher 管理时是用 rancher fluentd+ELK,现在改成 docker-compose 交付项目后为了方便用 Grafana 看用的 Grafana Loki,用什么收集日志和你对日志未来的的处理有关,尽量选择生态内的推荐组件效率对接简单效率能高点

50 台,用 ansible + grep

xiaox 回复

50 台用 k8s 好管理点

日请求量级 7 亿,30 台机器用的腾讯云日志服务,一个月日志费用 1W

victor 回复

你们的请求量是真大

需要 登录 后方可回复, 如果你还没有账号请 注册新账号