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

 

iostat 로깅 스크립트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다