背景

背景:服务上K8S集群后,使用rancher等工具可以查看实时日志,但不便于查看过去的日志。尤其是服务升版后,因为容器是重新启动的,过去的日志就查看不了了。如果想要查询历史日志,可以选用传统的elk,或者使用skywalking skywalking 接入 springboot 。然而elk需要日志过滤才能友好显示,kibana的查询也略显复杂,对普通开发者来说学习成本并不小。

需求:其实查看历史日志的情况不多,出问题的时候,有日志文件即可

目标:每天备份一波日志,并保存

场景:由 node1、node2、node3 三台服务器组成的K8S集群,集群里运行着数10个springboot微服务

 

方案

方案

  1. node1 编写脚本,输出本机微服务日志
  2. node2 和 node3 复制 node1 脚本到本地,并执行
  3. node2 和 node3 拷贝生成好的日志到 node1
  4. node1 把日志按日期统一存放
  5. 三个节点均设置定时任务

实现

node1 脚本 record.sh

存放于 /root/record,举例 微服务 permission 、 auth 、 user

  • 获取日期参数$d
  • 新建文件夹,用于保存微服务 docker 容器的 id
  • 模糊查询获取微服务 docker 容器的 id
  • if 判断,如果 id 为空,则不输出 log 文件
#!/bin/bash
date +%Y-%m-%d  > ./date.log;
d=$(cat ./date.log);

logvar="/root/record/id_log";
mkdir -p $logvar

docker ps | grep 'dev-permission' | awk '{printf $1}'  > $logvar/dev-permission-id.log; 
id=$(cat $logvar/dev-permission-id.log);
if [ -n "$id" ];then
docker logs $id > /home/record/dev-permission-$d.log;
fi

docker ps | grep 'dev-auth' | awk '{printf $1}'  > $logvar/dev-auth-id.log; 
id=$(cat $logvar/dev-auth-id.log);
if [ -n "$id" ];then
docker logs $id > /home/record/dev-auth-$d.log;
fi

docker ps | grep 'dev-user' | awk '{printf $1}'  > $logvar/dev-user-id.log; 
id=$(cat $logvar/dev-user-id.log);
if [ -n "$id" ];then
docker logs $id > /home/record/dev-user-$d.log;
fi

备注:获取 docker 的 id 后,需要先输出到文件,再从文件拿出来,docker log 的时候才能识别变量id

 

node2、node3 脚本 scp.sh

先安装 sshpass

yum install sshpass -y

sshpass 执行如下报错,因为初次执行需要先手敲 scp 登录

Host key verification failed

在这里插入图片描述

脚本步骤

  • 删除旧的 log 文件
  • 从 node1 复制执行文件 record.sh 到本地
  • 执行 record.sh
  • 复制生成的 log 到 node1
#!/bin/bash
rm -f /home/record/*;
sshpass -p "rootpassword" scp -r root@[node1_ip]:/root/record/record.sh /root/record > record.sh;
sh /root/record/record.sh;
sshpass -p "rootpassword" scp -r /home/record/* root@[node1_ip]:/home/record/;

复制时加 * ,可以只复制文件里面的内容,否则会连带文件夹一起复制过去

 

node1 脚本 cp.sh

文件统一保存在 /home/servicelog 下,用时间做文件夹名分类

  • 创建日期文件夹
  • 复制 /home/record/* 的日志
  • 删除旧日志
#!/bin/bash
date +%Y-%m-%d  > ./date.log;
d=$(cat ./date.log);
mkdir -p /home/servicelog/$d;
cp -rf /home/record/* /home/servicelog/$d/;
rm -f /home/record/*;

 

定时任务

编辑定时任务

vim /etc/crontab

node1

0 5 * * * root sh /root/record/record.sh
10 5 * * * root sh /root/record/cp.sh

node2 和 node3

 5 * * * root sh /root/record/scp.sh

重启定时任务

systemctl restart crond

 

成果展示图

在这里插入图片描述
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐