현재 오류에 대해 로그 파일을 모니터링하는 쉘 스크립트

현재 오류에 대해 로그 파일을 모니터링하는 쉘 스크립트

이 스크립트는 로그 파일에서 "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으로 파이프해야 합니다. 그렇지 않으면 로그 파일이 그 사이에 커져서 다음 줄을 놓칠 수 있습니다. 또는 순서를 바꾸는 경우, 그러면 같은 줄을 두 번 구문 분석할 수 있습니다.headgrepwc

위의 내용은 로그 파일에 대한 쓰기가 한 줄당 1개의 원자 작업으로 수행된다고 가정합니다. 부분 줄을 개별적으로 쓴 다음 완료 시 줄 바꿈을 추가하는 경우 마지막(및 부분) 줄을 무시해야 합니다. 위의 구문 분석된 로그 파일.

관련 정보