ログチェックスクリプト

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