多主机集群日志抓取

 

        很无聊,想起前短时间产品报了个bug,需要在生产环境抓取相关日志报文信息。结果生产环境10个节点,苦逼的去一个一个切换,并grep查询,今天无聊就想起这个事情,动手解决这个问题。另外,别见笑,小功能。

        首先确定目标,linux环境,所以必须使用shell了,我能说我全程现学现卖,搞定的么,连字符串拼接都很懵逼的。

        十个节点,将每个节点的ip地址写到文件里面。

        实现思路是一个主节点调用脚本,输入相关关键词,主节点调用其他节点布置好的脚本,使其打印本机的相关日志。  

        因为生产环境使用堡垒机。所以需要except环境,于是,运维兄弟早搭建好了。

     

进入正题:(必须有except环境)

相关内容打马了xxx

首先是在每个节点布置一个打印相关日志的脚本,要求只有一个,可以接受变长入参,具体看代码:(文件名:_log.sh)

#!/bin/bash
if [ $# == 1 ] ; then 
	cat /xxx/xxxxx/logs/catalina.out |grep $1
elif [ $# == 2 ] ; then 
	cat /xxx/xxxxxx/logs/catalina.out |grep $1|grep $2
elif [ $# == 3 ] ; then 
	cat /xxx/xxxxxx/logs/catalina.out |grep $1|grep $2|grep $3
elif [ $# == 4 ] ; then 
	cat /xxx/xxxxx/logs/catalina.out |grep $1|grep $2|grep $3|grep $4
elif [ $# == 5 ] ; then 
	cat /xxx/xxxx/logs/catalina.out |grep $1|grep $2|grep $3|grep $4|grep $5
elif [ $# == 6 ] ; then 
	cat /xxx/xxxx/logs/catalina.out |grep $1|grep $2|grep $3|grep $4|grep $5|grep $6
else
	cat '输入相关关键字'
fi

 

这段代码用于布置在每个节点下,命令很简单,判断入参长度,一个的两个的三个的,只用于定位日志。用管道操作。

 

其次是调用这个脚本的脚本,放置于主节点(自己喜欢登入的哪个都可以),且看代码:(文件名 log.sh)

#!/usr/bin/expect -f
set ip [lindex $argv 0]
set arg " "
for {set i 1} {$i<$argc} {incr i} {
	set temp [lindex $argv $i]
	set arg ${arg}\ ${temp}
}

set cmd  "sh xxxx/_log.sh"
set finalCmd ${cmd}$arg
spawn ssh $ip $finalCmd
expect {
 	 "password:" {send "xxxx\r"} 
	}
expect eof
 

这段代码emmmm,用到了except,其实我也不是很了解,但模仿还是很到位的,首先要做的是获取其他节点的ip,这个可以定生死为第一个入参,其次是抓取日志所用的关键字,在except里面的if,for等操作都不一样,现场百度,甚至字符串拼接什么的也不一样,现场百度。

在一个for循环内,通过$argc取得入参长度,除开第一个ip地址,其他的都是抓日志的关键字,于是循环内将各个关键字用空格隔开的拼接在一起,然后又鬼魅的把 sh xxx/_log.sh 拼前面去,为啥?因为跨主机调用远程脚本可以这么玩 ssh ip cmd,但是由于使用堡垒机,需要账号密码,于是使用spawn和except配和,将密码自动输入。

 

接下来就是,给这个脚本放ip和关键字了,不要说为什么不妨一块,我也不知道,大概因为#!/usr/bin/expect -f 之下无法使用bash

 

且看调用代码:(文件名logSearch.sh)

#!/bin/bash
while read line
do
 IP=`echo $line |awk '{print $1}'` 
 echo  ./log.sh $IP $1
if [ $# == 1 ] ; then 
 ./log.sh $IP $1 
elif [ $# == 2 ] ; then 
./log.sh $IP $1  $2
elif [ $# == 3 ] ; then 
./log.sh $IP $1  $2 $3
elif [ $# == 4 ] ; then 
./log.sh $IP $1  $2 $3 $4
elif [ $# == 5 ] ; then 
./log.sh $IP $1  $2 $3 $4 $5
elif [ $# == 6 ] ; then 
./log.sh $IP $1  $2 $3 $4 $5 $6
else
./log.sh $IP
fi
done < iplist

这里需要一个iplist的文件

 

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

xxx.xxx.xx.xx

 

在一个while循环里面,读取iplist文件,读读一行就干活,即读一行,就在一个ip节点内查询日志一下

内部使用很水的if 判断入参长度,调用log.sh一下。

 

你可能感兴趣的:(LINUX)