로그 회전을 수행하여 파일에서 주기적으로 새 줄을 가져옵니다.

로그 회전을 수행하여 파일에서 주기적으로 새 줄을 가져옵니다.

저는 상당히 간단한 방법을 찾고 있습니다(개발이 필요하지 않습니다. 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하십시오 . :zshdashyashposh-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

따라서 새 파일이 나타날 때까지 이전 파일을 계속 읽습니다.

commandexec실패 시 쉘이 종료되는 것을 방지해야 합니다 (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.

관련 정보