현재 나에게는 곤란한 문제가 있다. 이것을 알아내는 데 꽤 시간이 걸릴 것입니다. 어쨌든, 내가 하는 일은 다음과 같습니다.
여러 서버에서 로그 파일을 수집 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
디버깅에서 본 내용입니다). 이 설명이 의미가 있기를 바랍니다.
따라서 작은 프로세스일 수도 있습니다.
rsync
test.log.1
시간 속성이 있는 파일 목록을 가져옵니다test.log.2
.- 로그가 회전 중입니다(
test.log.1
이름이 지정test.log.2
되었으며.2
현재.3
). rsync
수집 시작(test.log.1
및test.log.2
)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 ....