用于监视日志文件中当前错误的 shell 脚本

用于监视日志文件中当前错误的 shell 脚本

此脚本监视日志文件中的模式“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执行 a并将其通过管道传输到 tail,然后再传输到 grep,否则日志文件可能会在和之间增长,然后您会错过下一行或者如果你交换了它们的顺序,那么你可以解析同一行两次。headgrepwc

请注意,上面假设写入日志文件的内容在每行 1 个原子操作中执行 - 如果它单独写入部分行,然后在完成后附加换行符,那么您需要忽略最后一行(可能是部分行)上述解析的日志文件。

相关内容