应用服务通过nginx转发到四台应用服务器,且每台配置有8081、8082两个端口,无法确定某订单的业务发生在哪台服务器,逐台查找费时费力
达成效果:分布在多台linux上的日志合并为一个文件
一 、准备资源文件
1、目标服务器地址,应用(源)服务器地址、
目标服务器 | 合并后地址 | |
192.168.2.1 | /home/logs/Order.log |
应用服务器 | 端口 | 日志所在地址 |
192.168.1.1 | 8081、8082 |
/usr/service-8081/logs/Order.log /usr/service-8082/logs/Order.log |
192.168.1.2 | 8081、8082 |
/usr/service-8081/logs/Order.log /usr/service-8082/logs/Order.log |
192.168.1.3 | 8081、8082 |
/usr/service-8081/logs/Order.log /usr/service-8082/logs/Order.log |
192.168.1.4 | 8081、8082 |
/usr/service-8081/logs/Order.log /usr/service-8082/logs/Order.log |
二、Linux远程传输文件免密码
1、目标服务器192.168.2.1生成秘钥
执行以下命令,连续按Enter,会在会在/root/.ssh目录生成id_rsa、id_rsa.pub
ssh-keygen -t rsa -P ""
效果展示
2、源服务器设置秘钥
将公钥id_rsa.pub的值拷贝到源服务器192.168.1.1的文件中./root/.ssh/authorized_keys
3、测试
3.1 连接测试
登录目标服务器192.168.2.1,做连接测试
ssh -P 22 root@192.168.1.1
如下图,即代表连接成功
3.2 文件拷贝测试
执行以下命令,看文件是否拷贝成功
# scp -P 端口 root@ip:源文件 目的地址
scp -P 22 root@192.168.1.1:/usr/service-8081/logs/Order.log /home/logs/Order.log
4、文件合并
在另外3台服务器上重复操作1、2、3,然后把拷贝后的文件重命名
#重命名为 ip+端口+Order.log
mv /home/logs/Order.log "/home/logs/192.168.1 8081 Order.log"
#合并文件为1个
cat /home/logs/*.log > /home/logs/Order.log
效果展示
三、脚本样例
将步骤二中2、3改为有shell脚本实现,如下
#! /bin/bash
# 本地日志存放目录
DEST_BASE_DIR="/home/logs"
#定义源服务器列表
SERVERS=("192.168.1.1" "192.168.1.2" "192.168.1.3" "192.168.1.4" )
# 在目标服务器上创建目录结构: /home/logs/<server_ip><port>/<date>/
DEST_DIR="$DEST_BASE_DIR"
# 获取当前日期
#CURRENT_DATE=$(date +"%Y-%m-%d")
CURRENT_DATE=""
read -p '请确认本次【1】当天,【2】-录入日期' inputDate
echo "inputDate: $inputDate"
if [[ -z "${inputDate// }" ]];then
DEST_DIR="$DEST_BASE_DIR/$CURRENT_DATE"
mkdir $DEST_DIR
else
mkdir $DEST_DIR
fi
#删除历史日志
rm -rf $DEST_DIR/*.log
read -p '请确认本次【1】-8081,【2】-8082,【3】-全部' up
if [ $up = "1" ];then
# 遍历每个源服务器
for SERVER in "${SERVERS[@]}"; do
echo "Processing server: $SERVER"
# 从源服务器复制文件到目标服务器
scp -P 22 root@$SERVER:/usr/zebone/service-8081/logs/Order.log $DEST_DIR
echo "Files from $SERVER copied successfully"
mv $DEST_BASE_DIR/Order.log "$DEST_BASE_DIR/$SERVER 8081 Order.log"
done
cat $DEST_DIR/*.log > $DEST_DIR/Order.log
elif [ $up = "2" ];then
# 遍历每个源服务器
for SERVER in "${SERVERS[@]}"; do
echo "Processing server: $SERVER"
# 从源服务器复制文件到目标服务器
scp -P 22 root@$SERVER:/usr/zebone/service-8082/logs/Order.log $DEST_DIR
echo "Files from $SERVER copied successfully"
mv $DEST_BASE_DIR/Order.log "$DEST_BASE_DIR/$SERVER 8082 Order.log"
done
cat $DEST_DIR/*.log > $DEST_DIR/Order.log
elif [ $up = "3" ];then
# 遍历每个源服务器
for SERVER in "${SERVERS[@]}"; do
echo "Processing server: $SERVER"
# 从源服务器复制文件到目标服务器
scp -P 22 root@$SERVER:/usr/zebone/service-8080/logs/Order.log $DEST_DIR
mv $DEST_BASE_DIR/Order.log "$DEST_BASE_DIR/$SERVER 8081 Order.log"
#接口
scp -P 22 root@$SERVER:/usr/zebone/service-8081/logs/Order.log $DEST_DIR
mv $DEST_BASE_DIR/Order.log "$DEST_BASE_DIR/$SERVER 8082 Order.log"
done
cat $DEST_DIR/*.log > $DEST_DIR/Order.log
else
echo "输入内容不正确"
fi
set fileformat=unix
四、注意事项
1、数据脱敏
本文所涉及的登录用户(root)、ip(192.168.1.1)、端口(22)、文件名已脱敏,各位需要根据自己的情况调整
2、测试连接仍然需要输入密码
Authorized users only. All activities may be monitored and reported.
是SSH隧道建立成功的提示,说明公钥没有放置正确,参考步骤二 2 源服务器设置秘钥
Permission denied”、“Connection closed
SSH隧道建立失败,需要核对配置 /etc/ssh/sshd_config
3、权限说明
. ssh的文件权限必须设置正确
# 在源服务器上执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
五、参考链接
SCP配置后仍需密码的解决方案
评论前必须登录!
注册