Logrotate 엔진의 핵심 아키텍처
Logrotate는 설정 파일 기반 구성 시스템으로 운영되며, 기본적으로 크론 작업(일 1회) 또는 systemd.timer를 통해 정기적으로 실행됩니다. 엔진은 /etc/logrotate.conf(전역 설정) 및 /etc/logrotate.d/ 디렉터리(애플리케이션별 설정)에서 정책을 읽어 적용합니다. 동시 실행 방지를 위해 /var/lib/logrotate.status 상태 파일에 대한 파일 잠금을 획득하며, 잠금 획득 실패 시 종료 코드 3으로 진입하여 다중 logrotate 프로세스 간의 경합을 방지합니다.
회전 트리거 메커니즘
Logrotate는 두 가지 독립적 회전 조건을 지원합니다. 시간 기반 회전은 일간(daily), 주간(weekly), 월간(monthly) 등의 빈도로 지정되며, 마지막 회전 이후 경과 시간이 조건을 만족할 때 작동합니다. 용량 기반 회전은 size 지시자를 통해 파일 크기 임계값(예: 100M)을 초과할 때 즉시 트리거됩니다. Minsize는 시간과 크기 조건을 결합하여(예: 일간이지만 최소 50MB 초과 시), maxsize는 스케줄을 무시하고 크기 도달 시 즉시 회전하게 합니다.
회전 전략: Create vs. Copytruncate
Create(기본값)는 활성 로그 파일을 다시 명명(예: myapp.log → myapp.log.1)하고 원본 이름의 새로운 빈 파일을 생성합니다. 애플리케이션이 SIGHUP 신호로 파일을 다시 열 수 있어야 하며, 로그 손실이 최소화됩니다. Copytruncate는 로그 파일을 복사한 후 원본을 제자리에서 제로로 초기화하므로 애플리케이션이 파일 디스크립터를 통해 계속 쓸 수 있습니다. 다만 복사와 절단 사이의 미소 시간 윈도에서 데이터 손실 가능성이 있어, 신호 처리 불가능한 레거시 애플리케이션에만 권장됩니다.
실무 운영 주의사항
상태 파일 잠금은 병렬 실행 방지의 핵심이며, --skip-state-lock 또는 --wait-for-state-lock 옵션으로만 이를 우회할 수 있습니다. Postrotate 스크립트는 회전 후 애플리케이션 리로드(예: kill -HUP, systemctl reload)를 담당하며, sharedscripts 지시자로 와일드카드 패턴 매칭 시 스크립트 중복 실행을 방지할 수 있습니다. 네트워크 스토리지(NFS) 환경에서는 파일 이름 변경 원자성 보장 불가로 인해 copy나 copytruncate 옵션 필수이며, Delaycompress를 활용하면 최근 회전 파일의 압축을 차기 순환까지 연기하여 긴급 분석 시 접근성을 확보할 수 있습니다.