Rsync는 로그 파일을 회전합니다.

Rsync는 로그 파일을 회전합니다.

현재 나에게는 곤란한 문제가 있다. 이것을 알아내는 데 꽤 시간이 걸릴 것입니다. 어쨌든, 내가 하는 일은 다음과 같습니다.

여러 서버에서 로그 파일을 수집 rsync하여 보관합니다. 보존 시간 속성이 중요하므로 내가 사용하는 아카이브 모드를 사용합니다 rsync. 그러나 어떤 경우에는 이로 인해 오류가 발생할 수 있습니다.

문제는 로그 파일이 서버에서 순환(변경)된다는 것입니다.

따라서 현재 사용 중인 로그는 다음과 같이 이름이 지정됩니다 test.log(편집되지 않음 rsync). 로그 파일은 일정 기간 및/또는 특정 파일 크기 후에 순환됩니다. test.log이름이 변경됨을 의미합니다 test.log.1. 이제 test.log다시 회전 하면 test.log.1이름 이 test.log.2으로 test.log변경됩니다 test.log.1.

test.log그냥 내가 원할 때마다 가는데 test.log.2문제 없어요. 하지만 이건 내가 바꿀 수 없는 일이다.

그리고 이 회전은 rsync제가 비행하는 동안 어떻게든 (때때로) 발생합니다. 따라서 rsync파일의 모든 시간 속성을 가져온 다음 회전하고 rsync로그 파일 수집을 시작하십시오. 하지만 이제 예를 들어 test.log.1더 이상 같은 파일이 아닙니다. 하지만 rsync어쨌든 얻었습니다. 결국 rsync서버의 파일은 변경되었기 때문에 삭제할 수 없습니다( rsync디버깅에서 본 내용입니다). 이 설명이 의미가 있기를 바랍니다.

따라서 작은 프로세스일 수도 있습니다.

  1. rsynctest.log.1시간 속성이 있는 파일 목록을 가져옵니다 test.log.2.
  2. 로그가 회전 중입니다( test.log.1이름이 지정 test.log.2되었으며 .2현재 .3).
  3. rsync수집 시작( test.log.1test.log.2)
  4. rsync특정 파일을 삭제할 수 없습니다

그렇다면 이러한 일이 발생하지 않도록 방지할 수 있는 옵션이 있습니까?

답변1

이 문제는 복사-아카이브 단계보다는 순환 단계에서 가장 잘 해결됩니다. 파일에 일련 번호를 제공하는 대신 파일 날짜를 기록하도록 로그 회전을 변경하면 rsync 보관에는 올바른 작업™을 수행하기 위한 논리가 필요하지 않습니다.

이미 회전을 위해 logrotate를 사용하고 있다고 가정하면 이 dateext옵션을 사용하여 이를 수행할 수 있습니다. 그러나 애플리케이션이 자체 회전을 관리하는 경우 구성이 더 어려울 수 있습니다. log4j가 회전 파일에 날짜를 추가할 수도 있다는 것을 알고 있지만 이는 구성을 통해 노출되지 않을 수 있으므로 애플리케이션 변경이 필요할 수 있습니다. 애플리케이션 수준 회전을 끄고 logrotate를 사용할 수도 있습니다.

답변2

전송이 끝나면 rsync전송된 파일이 전송을 시작한 파일과 일치하는지 확인하십시오. 파일이 일치하지 않으면 경고를 표시하고 다음 파일로 이동합니다. 그렇다면 --remove-source-files잘못 전송되었거나 불완전하게 전송된 것으로 생각되는 파일은 삭제되지 않습니다.

로그 파일을 성공적으로 전송할 수 있는 기회가 있는 경우 이를 더 자주 반복하거나 성공할 때까지 rsync큰 해를 끼치지 않습니다 .rsync

k=3
while test 0 -lt $k && k=$((k-1))
do
    rsync .... && break
    sleep 10
done

그래도 문제가 해결되지 않으면 복사할 수 있을 만큼 오랫동안 로그 파일을 "스냅샷"하는 방법을 고려해야 합니다.

ssh -q remote_host 'mkdir -p rsync.tmp; cp -p *.log rsync.tmp/'
rsync -a --remove-source-files remote_host:/path/to/logs/rsync.tmp/*.log ....

관련 정보