
商用のログ監視ツールがサポートしていない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