Copytruncate는 실제로 어떻게 작동합니까?

Copytruncate는 실제로 어떻게 작동합니까?

다음 구성을 사용하여 파일을 회전하기 전에 copytruncate다음 사항을 알고 싶습니다.logrotate

/app/syslog-ng/custom/output/all_devices.log { 
size 200M 
copytruncate
dateext 
dateformat -%Y%m%d-%s 
rotate 365 
sharedscripts 
compress
postrotate 
    /app/syslog-ng/sbin/syslog-ng-ctl reload 
endscript 
}

RHEL 7.x, 8GB 메모리, 4VCpu

질문:

syslog-NG가 로깅을 위해 파일을 열었을 때 파일을 어떻게 자르나요 logrotate? 이것은 자원 경쟁이 아닌가? syslog-NG는 기록할 내용이 없을 때 즉시 파일을 닫나요?

답변1

기록기가 O_APPEND를 사용하여 쓰기 위해 파일을 열기 때문에 로그 파일 자르기가 실제로 작동합니다.

~에서오픈(2)매뉴얼 페이지:

O_APPEND: 파일이 추가 모드로 열립니다. 각 write(2) 이전에 파일 오프셋은 lseek(2)와 마찬가지로 파일 끝에 있습니다. 파일 오프셋 수정 및 쓰기는 단일 원자 단계로 수행됩니다.

언급한 대로 작업은 원자적이므로 쓰기가 실행될 때마다 추가됩니다.현재의이전 쓰기 작업이 완료되기 전에 저장된 오프셋이 아닌 파일 끝과 일치하는 오프셋입니다.

이렇게 하면 잘라내기 작업 후에 추가 작업이 수행되어 파일을 다시 열지 않고도 파일 시작 부분에 다음 로그 줄을 다시 쓸 수 있습니다.

(O_APPEND의 동일한 기능을 사용하면 여러 작성자가 서로의 업데이트를 방해하지 않고 동일한 파일에 추가할 수도 있습니다.)

또한 로거는 단일 write(2) 작업을 사용하여 로그 줄을 기록하여 자르기 또는 동시 쓰기 작업 중에 로그 줄이 두 개로 분할되는 것을 방지합니다.

copytruncatesyslog, syslog-ng 또는 rsyslog와 같은 로거는 일반적 으로 로그 파일 다시 열기를 지원하므로(일반적으로 SIGHUP을 전송하여) 사용할 필요가 없습니다 . logrotate에 대한 지원은 copytruncate일반적으로 로그 파일에 첨부되지만 반드시 로그 파일을 다시 열 수 있는 좋은 방법이 없는 다른 로거에 대한 요구를 수용하기 위해 존재합니다(따라서 이름 바꾸기를 통한 회전은 이러한 경우 작동하지 않습니다.)

또한 copyrotatelogrotate가 복사를 마친 후 잘림 작업이 실행되기 전에 작성자가 로그 파일에 한 줄을 추가할 수 있으므로 고유한 경쟁 조건이 있다는 점에 유의하세요. 이 경쟁 조건으로 인해 이러한 로그 줄이 영원히 손실됩니다. 이것이 copytruncate유일한 가능한 접근 방식이 아닌 이상 로그 회전이 일반적으로 권장되지 않는 이유입니다 .

관련 정보