ログチェックスクリプト
商用のログ監視ツールがサポートしていないOSを使用しないといけなくなったときの記録。
logmonを試してみたが、プロセスが落ちているときはログがどこまでチェックしたか、記録していない。
logmonサービス起動時に対象ログの最終行を取得して、その位置からチェックを始めるみたい。
logmonサービス起動時に対象ログの最終行を取得して、その位置からチェックを始めるみたい。
既存のツールが監視運用の要件に合わないため、自作した。
#!/bin/bash# 対象ファイルTARGET_LOG="/root/script/alert/alert.log"# 作業ディレクトリWORK_DIR="/root/script/alert/"# チェックポイントLOG_CHK_POINT="${WORK_DIR}log_chk_point.txt"CHK_POINT=0# ログファイルのinodeLOG_FILE_INODE="${WORK_DIR}log_inode.txt"INODE=`ls -li ${TARGET_LOG} | awk '{print $1}'`cd ${WORK_DIR}if [ -e ${LOG_FILE_INODE} ]; then # 以前調べたことがある場合 OLD_INODE=`/bin/cat ${LOG_FILE_INODE}` if [ ${INODE} != ${OLD_INODE} ]; then # inodeが違う場合、ローテーション後を示すため、リセットする。 echo "0" > ${LOG_CHK_POINT} echo ${INODE} > ${LOG_FILE_INODE} else CHK_POINT=`/bin/cat ${LOG_CHK_POINT}` fielse echo ${INODE} > ${LOG_FILE_INODE}fiWORK_FILE="${WORK_DIR}work.txt"tail -n +${CHK_POINT} ${TARGET_LOG} > ${WORK_FILE}send_log=""CNT=0while read linedo if [ `echo ${line} | grep -i "ORA-"` ]; then send_log=${send_log}"\n"${line} fi CNT=$(expr $CNT + 1)done < ${WORK_FILE}CHK_POINT=$(expr $CHK_POINT + $CNT)#echo $LOG_CHK_POINT#echo $send_logsendMail() { echo 'MIME-Version: 1.0Content-Type: text/plain; charset="ISO-2022-JP"Content-Transfer-Encoding: 7bitSubject: ${3}From: ${1}To: ${2}${4}' | sendmail -t return $?}if [ -n "${send_log}" ]; then # メール送信 from="aaaaaa" to="aaaaaa" subject=" ${TARGET_LOG}" contents="[${TARGET_LOG}]\n${send_log}" echo -e "$contents" | mail -s "$subject" "$to" -- -f "$from" #sendMail "$from" "$to" "$subject" "$contents" if [ $? -eq 1 ]; then echo "send mail failure" exit 1 fi #echo "[${TIMESTAMP}] send mail success"fiecho $CHK_POINT > ${LOG_CHK_POINT}exit |