저는 상당히 간단한 방법을 찾고 있습니다(개발이 필요하지 않습니다. Python으로 작성할 수 있지만 이미 갖고 있는 것이 있으면 좋겠습니다).
로그 파일이 있습니다(내 경우에는 rsyslogd로 작성됨). 분석 목적으로 나는 1분마다 읽고 내 http 서버의 페이지 조회 수와 같은 마지막 순간의 지표를 계산하고 싶습니다. 내 요청 2개:
1) 마지막으로 파일을 읽은 이후 추가된 줄만 보고 싶습니다. (마지막 1분 정도만 필요합니다. 파일이 너무 커서 1분마다 다시 읽고 필터링할 수 없습니다.)
2) 하루에 한 번씩 파일을 녹음하세요. 로그 회전 후 처음으로 아직 읽지 않은 이전 파일의 모든 줄과 새 파일의 모든 줄을 원합니다.
지금 그것을 요구하는 사람은 나뿐인 것 같습니다. 다른 사람들은 어떻게 할까요?
답변1
your-filter
해당 데이터가 stdin에서 읽혀진다고 가정합니다 .
while your-filter; do
sleep 60
done < file.log
예를 들어 your-filter
데이터를 읽기만 하고 데이터 쓰기를 시도하지 않는다고 가정해 보겠습니다.lseek
/dev/fd/n
이제 로그 회전 문제를 해결하려면 Linux( 실제 파일에 대한 심볼릭 링크인 대부분의 다른 시스템과 달리)에서 ,,,,, ksh
( POSIX가 아닌 것과 같은 가장 현학적인 쉘을 제외한 대부분의 POSIX 쉘 ) 를 사용 bash
하십시오 . :zsh
dash
yash
posh
-ef
while your-filter; do
if [ file.log -ef /dev/stdin ]; then
sleep 60
else
exec < file.log
fi
done < file.log
로그 회전 시 your-filter
이전 연결과 새 연결에 대해 한 번 호출하려면 두 번 호출됩니다.
while
if [ file.log -ef /dev/stdin ]; then
your-filter
else
exec 3<&0 < file.log
(cat <&3; cat) | your-filter &&
exec 3<&-
fi
do
sleep 60
done < file.log
이제 로그가 순환되는 동안 이전 file.log의 이름이 바뀌었지만 새 file.log file.log
가 생성되지 않은 경우가 있을 수 있으며, exec < file.log
이때 수행하면 위 작업이 실패하게 됩니다. 그런 다음 다음을 사용하여 이 문제를 해결할 수 있습니다.
while
if [ file.log -ef /dev/stdin ] || ! command exec 3< file.log; then
your-filter
else
(cat; cat <&3) | your-filter &&
exec <&3 3<&-
fi
do
sleep 60
done < file.log
따라서 새 파일이 나타날 때까지 이전 파일을 계속 읽습니다.
command
exec
실패 시 쉘이 종료되는 것을 방지해야 합니다 (POSIX에서 요구하는 대로). 모드 zsh
에 있거나 bash
없을 때는 필요하지 않습니다 sh
.
이제 루프에서 60초 동안 잠을 자고 your-filter
실행하는 데 몇 초가 걸릴 수 있습니다. your-filter
분당 평균 1회 실행이 중요한 경우 ksh
, bash
또는 를 사용하여 zsh
다음과 같이 변경할 수 있습니다.
t=$SECONDS
while
if [ file.log -ef /dev/stdin ] || ! command exec 3< file.log; then
your-filter
else
(cat; cat <&3) | your-filter &&
exec <&3 3<&-
fi
do
t=$(($t + 60))
sleep "$((t - SECONDS))"
done < file.log
ksh93
및 및 부동 소수점 인수를 허용 zsh
하는 경우 sleep
실행할 수 있습니다 typeset -F SECONDS
.