現在のエラーに対してログファイルを監視するシェルスクリプト

現在のエラーに対してログファイルを監視するシェルスクリプト

このスクリプトはログファイルの「ora」パターンを監視し、エラーの詳細を抽出して電子メールを送信します。この場合、ログファイルから最後に発生したエラーのみを抽出したいと思います。私は5分ごとにcrontabを設定し、grepが誤った警告を引き起こすのと同じ古いエラーを取得します。スクリプトは現在の時間に関するエラーを取得し、古いエラーを見つけてはいけません。

mailto=xyz.email.com
logdirectory=/location/to/logfile
cd $logdirectory
grep "ORA" logfile
if [ $? = 0 ]; then
mailx -s "errors" $mailto
fi

私のログファイル:

Fri Jun 07 05:09:32 2019 Archived Log entry 93 added for thread 1 sequence 59 ID 0xf10d426f dest 1: 
Fri Jun 07 11:08:20 2019 07-JUN-19 ORA-1100: Testing, Please Ignore

ベストアンサー1

次のオプション2を表示私のコメント〜のようにOPの要請に応じて:

awk -v parseLog='/some/where/filename' '
    BEGIN {
        prevNR=( (getline line < parseLog) > 0 ? line : 0 )
    }
    (NR>prevNR) && /ORA/{ print; found=1 }
    END {
        print NR > parseLog
        exit !found
    }
' /location/to/logfile

またはシェルから:

parseLog='/some/where/filename'
IFS= read -r line < "$parseLog"
if [[ -n "$line" ]]; then
    prevNR="$line"
else
    prevNR=0
fi
nr=$(wc -l < /tmp/logfile)
head -"$nr" /location/to/logfile |
    tail +"$(( "$prevNR" + 1 ))" |
    grep ORS
rslt=$?
printf '%d\n' "$nr" > "$parseLog"

まず、行番号を取得してからwcその行番号を実行し、tailにパイプし、次にgrepにパイプする必要があります。それ以外の場合は、ログファイルがその間に大きくなり、次の行を見逃す可能性があります。または、順序を変更した場合は、同じ行を2回解析できます。headgrepwc

上記は、ログファイルへの書き込みが1行につき1つのアトミック操作で実行されると想定しています。部分行を個別に書き込み、完了時に改行を追加する場合は、最後(および部分)行を無視する必要があります。上記の解析されたログファイル。

おすすめ記事