Bash 스크립트에서 로그 항목 타임스탬프 구별

Bash 스크립트에서 로그 항목 타임스탬프 구별

내 Bash 스크립트는 cron 작업으로 실행됩니다. 로그 파일에서 문자열을 찾고, 발견되면 해당 로그 항목을 메일을 통해 전달해야 합니다.

내 스크립트는 작동하지만 보고한 로그 항목에는 동일한 문자열이 포함되어 있지만 타임스탬프가 더 이전입니다. 관심 있는 로그 항목의 최신 타임스탬프만 보내도록 수정하고 싶습니다.

#!/bin/bash
grep "Too many files" /share/logs/access.log > /dev/null && grep "Too many files" /share/logs/access.log | mailx -s "Batch Error " to [email protected]

해당 크론 작업은 10분마다 실행됩니다.

*/10 * * * *  /myscripts/joberror.sh

내가 찾고 있는 로그 항목은 access.log다음과 같습니다.

uzeadnos12 2020-10-14 13:29:00,443 ERROR  - Error occured while converting document using Libreoffice - /shard.tiff java.io.IOException: Cannot run program "": error=24, Too many open files

누구든지 이 스크립트를 개선하도록 도와줄 수 있나요?

답변1

~/spool/last_jobrec크론 작업에서 기록된 마지막 타임스탬프를 기록할 수 있는 컨테이너(예: 파일 )를 만듭니다 . 이를 마지막으로 추가된 로그 항목의 타임스탬프와 비교합니다. 둘이 다를 때 알림이 내보내지고, 둘이 같을 때는 아무 작업도 수행되지 않습니다.

$ mkdir -p /path/to/spool    # choose a place for spool directory.
$ 
$ cat /myscripts/joberror.sh
#!/bin/bash
touch /path/to/spool/last_jobrec   # ensure appropriate permissions
latest_logentry=$(grep --no-messages --no-filename --max-count=1 -e "Too many open files" <(tac /share/logs/access.log))
latest_logstamp=$(cut -d' ' -f1,2 <(echo $latest_logentry))
if [ "$latest_logstamp" != "$(cat /path/to/spool/last_jobrec)" ]; then
    echo "$latest_logentry" | mailx -s "Batch Error " to [email protected]
    echo "$latest_logstamp" >| /path/to/spool/last_jobrec
fi

검증되지 않은. 특히 저는 이 유틸리티를 사용하지 않습니다 mailx.

논평:
1)새 로그 항목이 로그 파일 끝에 추가된다고 가정합니다.
2)위의 변수를 채우기 위해 last_entrystamp저는 grep. 그렇지 않은 경우 grep스크립트의 줄을 다음으로 바꾸 십시오.latest_logentry=$(tail -1 /share/logs/access.log)

관련 정보