多服务器的日志收集是为了解决日志文件不集中的问题,现实中由于服务器的性能限制,线上许多项目部署在不同服务器中,产生的日志都在各个项目部署服务器中,运维人员进行维护时,只能逐一访问服务器,检查日志文件进行维护,过程繁杂耗时。多服务器的日志收集的实现主要包括日志切分、文件下载、服务器配置、定时下载四个步骤。
日志切分是指,原始tomact 的日志输出在单个catalina.out文件中。如果不进行切分存储,则会造成catalina.out文件庞大,难以进行日志跟踪。常用的日志切分方式有,按时间切分、按文件大小切分等,
这里采用以天为单位进行日志切分。
文件下载是指,通过运行sh脚本,实现对某个服务器上指定位置的文件进行下载。文件下载的主要工具需要用到lftp插件,进行远程sftp操作。
服务器配置, 主要是用于对每台服务器上不同文件路径的文件下载,进行配置。
定时下载是指,通过crontab工具,实现每天凌晨拉取昨日文件,每隔5分钟拉取实时日志的功能。实现日志文件的集中存放查看,减少追踪日志时,需要到具体某一个服务器的某个tomcat的日志目录中查询日志的繁琐操作。
多服务器的日志收集项目结构如下图所示
- bin目录主要存放脚本文件,用于执行任务。
-
download.sh用于下载某一天的日志
-
config.sh用于配置多服务器的属性、目标下载目录等。
-
logs目录主要存放各个服务器及其tomcat的日志文件。
日志切分主要有三种方式,1.sh定时脚本切分、2.第三方工具(log4j、cronolog)
1.sh定时脚本切分:通过自己写的脚本对日志进行切分。优点:灵活、自定义程度高。缺点:需要手动维护,定时任务配置要求严格,会产生日志文件丢失。
2.log4j:优点:单独的配置文件,不用修改catalina.sh,自定义程度较高。缺点: 2022年1月爆出log4j存在高危漏洞.
3.cronolog:优点:安全。缺点:自定义程度低,需要修改catalina.sh,在修改过程中可能因为tomcat版本不同出现差异。
参考资料:
https://blog.csdn.net/yuki5233/article/details/82257889?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-2-82257889-blog-122333342.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-2-82257889-blog-122333342.pc_relevant_paycolumn_v3&utm_relevant_index=5
该系统采用cronolog方式进行切分,下载安装cronolog工具的脚本如下:
#!/bin/bash cd ~ pwd wget https://files.cnblogs.com/files/crazyzero/cronolog-1.6.2.tar.gz tar xf cronolog-1.6.2.tar.gz cd cronolog-1.6.2 ./configure make & make install echo "cronolog is installed, its command location is as fallow" which cronolog
文件下载地址:https://files.cnblogs.com/files/crazyzero/cronolog-1.6.2.tar.gz 暂时比官网快,后期若出现下载慢,或不存在资源可自行进行更换。
下载完成后会出现以下提示:/usr/local/sbin/cronolog及代表工具安装成功。
文件的压缩包在首次登录的文件路径, 可执行以下命令进行查看
[root@VM-20-5-centos ~]# cd ~ [root@VM-20-5-centos ~]# ll total 188 -rw-r--r-- 1 root root 6 May 18 14:50 a.txt drwxrwxrwx 6 201 201 4096 May 17 17:58 cronolog-1.6.2 -rw-r--r-- 1 root root 133591 Aug 25 2017 cronolog-1.6.2.tar.gz
会出现该问文件夹cronolog-1.6.2和压缩包cronolog-1.6.2.tar.gz
catalina.sh文件修改:
org.apache.catalina.startup.Bootstrap “$@” start >> “$CATALINA_BASE”/logs/catalina.out 2>&1 & #将上面两行内容替换为以下内容: org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/local/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null & #然后再注释掉: touch "$CATALINA_BASE"/logs/catalina.out #其实touch catalina.out(创建这个文件)的语句,注不注掉都无所谓,反正修改成功了里面不会有东西的。
重启tomcat后在logs文件夹下就会出现当日的日志catalina.2022-xx-xx.out
文件下载文件下载需要lftp插件,命令如下:
[root@VM-20-5-centos ~]# yum -y install lftp [root@VM-20-5-centos ~]# which lftp /usr/bin/lftp
出现 /usr/bin/lftp表示安装成功
文件下载脚本为down.sh,其内容如下
#!/bin/bash
#文件下载
#初始化
#日期
currentDay=$(date "+%Y-%m-%d %H:%M:%S")
#DOWN_DIR=/root/tomcat-tms-8866/logs
DOWN_DIR=$4
#下载的文件名
DOWN_FILE="catalina.${downloadDay}.out"
DOWN_FULL_FILENAME=${DOWN_DIR}/${DOWN_FILE}
#SAVE_DIR=/root/shell/logs
SAVE_DIR=$5
SAVE_FILE_TAR="${DOWN_FILE}.tar"
SAVE_FULL_FILENAME=${SAVE_DIR}/${DOWN_FILE}
SAVE_FULL_FILENAME_TAR=${SAVE_DIR}/${SAVE_FILE_TAR}
DOWN_LOG=$SAVE_DIR/download_file.log
DOWN_LOG_ALL=${BASE_PATH}/bin/download.log
TASK_NAME=$6
#打印
echo -e " 33[42m ------------------------------------ In download sh, start task: ${TASK_NAME}, pid: $$ , time: $currentDay------------------------------------ 33[0m"
echo -e "--> remote full name : 33[37m ${DOWN_FULL_FILENAME} 33[0m "
echo -e "--> local save file : 33[31m ${SAVE_FULL_FILENAME_TAR} 33[0m"
#删除已下载的文件
if [ -e ${SAVE_FULL_FILENAME_TAR} ];then
rm -f ${SAVE_FULL_FILENAME_TAR}
echo -e "--> the local duplicate file: 33[31m ${SAVE_FULL_FILENAME_TAR} 33[0m existed, delete finish"
else
echo -e "--> no file: 33[31m ${SAVE_FULL_FILENAME_TAR} 33[0m duplicate "
fi
if [ -e ${SAVE_FULL_FILENAME} ];then
rm -f ${SAVE_FULL_FILENAME}
echo -e "--> the local duplicate file: 33[31m ${SAVE_FULL_FILENAME} 33[0m existed, delete finish"
else
echo -e "--> no file: 33[31m ${SAVE_FULL_FILENAME} 33[0m duplicate "
fi
#判断保存的文件夹是否存在
if [ -d ${SAVE_DIR} ];then
echo -e "--> the save folder: 33[34m ${SAVE_DIR} 33[0m existed "
else
mkdir -p ${SAVE_DIR}
echo -e "--> the save folder: 33[34m ${SAVE_DIR} 33[0m not exist, now has created "
fi
#SFTP配置信息
#用户名
USER=$1
#echo ${USER}
#密码
PASSWORD=$2
#echo ${PASSWORD}
#IP
IP=$3
echo "--> the remote IP : ${IP}"
#端口
PORT=22
#下载文件 (关键部分)
#rm -f ${DOWN_FULL_FILENAME}
lftp -u ${USER},${PASSWORD} sftp://${IP}:${PORT} < task success"
echo "==##> ${TASK_NAME} download $currentDay's files from romote FTP server successful." >>$DOWN_LOG
echo "==##> ${TASK_NAME} download $currentDay's files from romote FTP server successful. IP: ${IP}, DIR: ${SAVE_DIR}. " >>$DOWN_LOG_ALL
cd ${SAVE_DIR}
tar -cf ${SAVE_FILE_TAR} ${DOWN_FILE}
rm -f ${DOWN_FILE}
else
echo "==!!> task fail"
echo "==!!> ${TASK_NAME} dwonload files failed, pls check." >>$DOWN_LOG
echo "==!!> ${TASK_NAME} download $currentDay's files from romote FTP server failed. IP: ${IP}, DIR: ${SAVE_DIR}. " >>$DOWN_LOG_ALL
fi
echo -e " 33[42m ------------------------------------ Out download sh, goodbye! ------------------------------------ 33[0m"
down.sh文件的入参主要有如下6个:
-
目标服务器登录名
-
目标服务器密码
-
目标服务器地址
-
目标服务器文件夹
-
本地存储文件夹
-
任务名
该脚本的执行方式为如下,参数传入以空格分隔:
sh ./download.sh root 123456 192.168.0.1 /tomcat/logs /local/logs s1_1
执行该脚本会打印如下信息:
服务器配置该脚本使用到map结构,需要 bash 4.1.2 版本以上支持
服务器配置文件命名为 config.sh,文件内容如下:
#!/bin/bash
#多服务器 配置
user=loguser
passwd='**********************'
export BASE_PATH=$(cd "$(dirname "$0")";cd ../;pwd)
SAVE_DIR_ROOT=${BASE_PATH}/logs
echo ${BASE_PATH}
input_day=$1
export downloadDay=`eval echo '$'"(date -d"${input_day}" "+%Y-%m-%d")"`
#注释是否开启;开启:note='echo' | 关闭:note=#
#note='echo'
note='#'
S1_IP=43.254.3.125
declare -A s1_1=(["IP"]=${S1_IP} ["down_dir"]="/root/tomcat-tms-8866/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S1_IP}/tomcat-tms-8866")
declare -A s1_2=(["IP"]=${S1_IP} ["down_dir"]="/root/tomcat-tms-8860/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S1_IP}/tomcat-tms-8860")
S2_IP=117.78.40.141
declare -A s2_1=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-houduan/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-houduan")
declare -A s2_2=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-city-8088/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-city-8088")
declare -A s2_3=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-shabro/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-shabro")
declare -A s2_4=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-shabro-check/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-shabro-check")
declare -A s2_5=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-shabro-new/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-shabro-new")
declare -A s2_6=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-sync/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-sync")
declare -A s2_7=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/apache-tomcat-web/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/apache-tomcat-web")
declare -A s2_8=(["IP"]=${S2_IP} ["down_dir"]="/home/tomcat/qianduan_tomcat/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S2_IP}/qianduan_tomcat")
S3_IP=49.4.94.16
declare -A s3_1=(["IP"]=${S3_IP} ["down_dir"]="/usr/local/tomcat/front-tomcat/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S3_IP}/front-tomcat/")
S4_IP=49.4.90.194
declare -A s4_1=(["IP"]=${S4_IP} ["down_dir"]="/usr/local/tomcat/sc-tomcat-all/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S4_IP}/sc-tomcat-all/")
array=("s1_1" "s1_2" "s2_1" "s2_2" "s2_3" "s2_4" "s2_5" "s2_6" "s2_7" "s2_8" "s3_1" "s4_1")
echo "----------------------------------------- Multi Task Begin Start -----------------------------------------------------"
for map in ${array[@]};do
eval "${note}" "----------------------------------------- Config start info -----------------------------------------------------"
eval "${note}" "current map : ${map}"
IP=`eval echo '$'"{${map}["IP"]}"`
eval "${note}" "IP: ${IP}"
down_dir=`eval echo '$'"{${map}["down_dir"]}"`
eval "${note}" "down_dir: ${down_dir}"
save_dir=`eval echo '$'"{${map}["save_dir"]}"`
eval "${note}" "save_dir: ${save_dir}"
eval "${note}" "----------------------------------------- Config end info -----------------------------------------------------"
sh ${BASE_PATH}/bin/download.sh ${user} ${passwd} ${IP} ${down_dir} ${save_dir} ${map}
done
echo "----------------------------------------- Multi Task Exec Finish -----------------------------------------------------"
config.sh文件的入参为下载日期,可为 today 、yesterday 、3 day ago 等,可参照
执行脚本的命令如下:
./config.sh yesterday
其中用于temp.log存在每条down.sh的打印信息
执行效果:
若要添加服务器配置,参考步骤如下:
1.声名一个服务器的IP
S100_IP=117.78.40.141
2.声名该服务器的map,其中包含ip、下载目录、存储目录。IP可通过 ${S100_IP} 获取,下载目录为目标服务器的日志存储目录,
存储目录为存放到本机的目录,格式可参考为 ${SAVE_DIR_ROOT}/${S100_IP}/apache-tomcat-houduan 。其真是目录为 /home/loguser/logstack/logs/服务器IP/tomcat项目目录/。
declare -A s100_1=(["IP"]=${S100_IP} ["down_dir"]="/home/tomcat/apache-tomcat-houduan/logs" ["save_dir"]="${SAVE_DIR_ROOT}/${S100_IP}/apache-tomcat-houduan")
3.在array数组追加一条map的引用名
array=("s1_1" ... "s100_1")
保存后运行 ./config.sh yesterday 即可生效。
定时下载
crontab安装:
定时下载任务需要用到crontab工具,下载安装过程如下
yum -y install vixie-cronyum -y install crontabs which crontab
出现:/usr/bin/crontab 提示表明安装成功
在执行定时任务前,需要将脚本更改为可执行文件, 定时任务才可以运行脚本。
命令为: chmod +x config.sh
定时任务配置:
输入crontab -e 即可进入定时任务编辑界面,操作与vim类似,按i进入编辑模式。
定时任务需要配置两条任务,一条用于下载昨天的日志,另一条用于下载实时日志。
每天两点,和2.30下载昨天的日志
*/30 2 */1 * * 目录/config.sh yesterday
每天每隔5分钟下载今日日志
*/5 * * * * /home/loguser/logstack/bin/config.sh today >> /home/loguser/logstack/bin/cron_today.log
退出后,会自动开启定时任务。为了防止突然断电等突发情况导致关机重启,可将crontab设置开机自启,这里不再赘述。可参考文章:
https://blog.csdn.net/owenzhang24/article/details/122537552



