商用のログ監視ツールがサポートしていないOSを使用しないといけなくなったときの記録。
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 # ログファイルのinode LOG_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}` fi else echo ${INODE} > ${LOG_FILE_INODE} fi WORK_FILE="${WORK_DIR}work.txt" tail -n +${CHK_POINT} ${TARGET_LOG} > ${WORK_FILE} send_log="" CNT=0 while read line do 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_log sendMail() { echo 'MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-2022-JP" Content-Transfer-Encoding: 7bit Subject: ${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" fi echo $CHK_POINT > ${LOG_CHK_POINT} exit