iostat 로그를 주기적으로 로깅하는 스크립이다.
이 스크립트 조금 수정하여 vmstat 등 원하는 상태체크 유틸과 연동해도 된다.
iostat는 sysstat rpm package에 포함된 util이다. sysstat가 설치되어 있어야 한다.
설치가 안되어 있으면 yum으로 설치한다.
1. 스크립트 내용
#!/bin/bash ##################### Modify variable ##################### LOGDIR="/var/log/iostat" KEEPDAYS="31" COUNT=6 INTERVAL=10 #EXCEPT=$(echo -e "sd[b-c],dm-[1-2],sdz,emcpower[a-z],scd*") ######################A#################################### if [ ! -d $LOGDIR ]; then mkdir -p $LOGDIR fi date | grep " 23:5" >& /dev/null if [ $? == "0" ]; then find $LOGDIR -ctime +$KEEPDAYS -daystart -type f -name "iostat.log"| grep $LOGDIR/iostat.log >& /dev/null if [ $? == "0" ]; then mv -f $LOGDIR/iostat.log $LOGDIR/iostat.log_old fi fi WhileNum=$COUNT while [ $WhileNum -ge 1 ] do echo "###########################################################################################################" >> $LOGDIR/iostat.log date >> $LOGDIR/iostat.log EXCEPTCHECK=$(echo $EXCEPT | egrep -i -e [a-z] -i -e [0-9] | sed '/ /d' | wc -l) if [ $EXCEPTCHECK == "1" ]; then EXCEPT2=$(echo $EXCEPT | sed 's/\, /,/g; s/ /\\ /g; s/,/\/d\;\ \//g; s/^/\//g; s/$/\/d\;/g; s/\^/\,/g') iostat -xc | sed "$EXCEPT2" >> $LOGDIR/iostat.log elif [ $EXCEPTCHECK == "0" ]; then iostat -xc >> $LOGDIR/iostat.log fi sleep $INTERVAL WhileNum=$((WhileNum-1)) done
* 스크립트 설명 :
1분 동안 6번의 로깅을 한다.
(EXCEPT 변수에 선언된 문자열은 제외하고 로그 생성을 한다.)
매일 23:50분에 로그파일의 생성일을 체크하여 31일이 지났으면 파일명을 iostat.log_old 로 변경하고 iostat.log 파일을 다시 생성하여 로깅한다.
* 변수(Variable) 설명 :
LOGDIR : 로그 파일이 저장될 위치이다.
KEEPDAYS : 로그의 최대 저장일 수
COUNT : 로깅 횟수
INTERVAL : 로그 간격
EXCEPT : 로그에 포함 시키지 않을 라인(장치명이나 단어 등을 표기). 정규표현식 사용이 가능하다. 주석을 빼고 설정하면 된다.
2. crontab에 등록
[root@Sample ~]# crontab -l # iostat log script */10 * * * * /root/iostat-log.sh
* 시간 주기를 1분 ~ 60분 사이의 값으로 넣으면 된다.
* 위 설정은 10분 마다 iostat-log.sh 스크립트가 실행되도록 설정한 것임.
* 위 스크립트는 로그 로테이션이 되지 않는 문제점이 있어서 아래와 같이 스크립트를 수정했다.
- find에 atime 또는 ctime을 기준으로 KEEPDAYS 시간이 넘을 경우 로테이션 시키려 했으나 파일을 write 만 해도 time 값이 현재 시각으로 변경되는 현상 때문에 로테이션을 못 함.
따라서 로그 내용에 Unix Time을 적용하는 방법으로 변경하고 지난 로그는 압축 보관하도록 함.
아래 스크립트를 적용 시킬 것
#!/bin/bash ##################### Modify variable ##################### LOGDIR="/var/log/iostat" KEEPDAYS="31" COUNT=6 INTERVAL=10 #EXCEPT=$(echo -e "sd[b-c],dm-[1-2],sdz,emcpower[a-z],scd*") ######################A#################################### if [ ! -d $LOGDIR ]; then mkdir -p $LOGDIR fi date | grep " 00:[0-3]" >& /dev/null if [ $? == "0" ]; then LOGUNIXTIME=$(head -n 100 $LOGDIR/iostat.log | grep UnixTime | head -n 1 | awk -F "=" '{print $2}') CURUNIXTIME=`date +%s` ACCOUNTTIME=`expr $CURUNIXTIME - $LOGUNIXTIME` KEEPUNIXTIME=$(($KEEPDAYS * 86400)) if [ $ACCOUNTTIME -ge $KEEPUNIXTIME ]; then mv -f $LOGDIR/iostat.log $LOGDIR/iostat.log_old gzip -f -1 $LOGDIR/iostat.log_old fi fi WhileNum=$COUNT while [ $WhileNum -ge 1 ] do echo "###########################################################################################################" >> $LOGDIR/iostat.log date +%Y-%m-%d"_"%T"_"%Z" UnixTime="%s >> $LOGDIR/iostat.log EXCEPTCHECK=$(echo $EXCEPT | egrep -i -e [a-z] -i -e [0-9] | sed '/ /d' | wc -l) if [ $EXCEPTCHECK == "1" ]; then EXCEPT2=$(echo $EXCEPT | sed 's/\, /,/g; s/ /\\ /g; s/,/\/d\;\ \//g; s/^/\//g; s/$/\/d\;/g') iostat -xc | sed "$EXCEPT2" >> $LOGDIR/iostat.log elif [ $EXCEPTCHECK == "0" ]; then iostat -xc >> $LOGDIR/iostat.log fi sleep $INTERVAL WhileNum=$((WhileNum-1)) done