Ubuntu 16.04 Server / logrotate 설치하고 설정하기
logrotate는 로그 파일을 주기나 크기 조건에 따라 교체하고 이전 파일을 보관·압축·삭제하는 도구입니다. Ubuntu에서 로그가 계속 쌓이는 것을 관리할 수 있지만, 실제 교체 시점은 logrotate를 실행하는 일정과 설정 조건에 따라 달라집니다.
Ubuntu 16.04의 지원과 준비 사항
Ubuntu 16.04 LTS의 일반 보안 유지보수와 Ubuntu Pro의 일반 확대 보안 유지보수(ESM)는 종료되었습니다. Canonical은 별도 Legacy 추가 서비스를 제공하므로 적용 범위와 비용은 Ubuntu 16.04 지원 안내에서 확인하고, 가능하면 지원되는 Ubuntu 버전으로 이전을 계획하세요. 아래의 기본 원리는 다른 버전에도 적용되지만 설치된 logrotate 버전과 실행 일정에 따라 세부 동작은 다를 수 있습니다.
먼저 설치 여부를 확인하고, Ubuntu에서 패키지가 없다면 설치합니다. 운영 서버의 설정을 변경하기 전에는 기존 설정과 필요한 로그의 백업·복구 방법을 확인하세요.
logrotate --version
sudo apt update
sudo apt install logrotate
기본 설정과 실행 일정 확인하기
전역 설정은 일반적으로 /etc/logrotate.conf에 있고, 개별 설정은 그 파일이 /etc/logrotate.d/를 포함하도록 구성된 경우에 읽힙니다. 서버의 실제 파일을 확인하세요. Apache 패키지가 설치된 환경에는 /etc/logrotate.d/apache2가 있을 수 있지만 로그 경로와 설정은 설치 환경에 따라 다릅니다.
cat /etc/logrotate.conf
ls -l /etc/logrotate.d/
cat /etc/logrotate.d/apache2
Apache 설정 파일이 없는 시스템에서는 마지막 명령이 실패할 수 있습니다. 같은 로그 경로를 두 설정에서 중복 관리하지 마세요. logrotate는 스스로 상주하며 정확한 시각에 실행되는 프로그램이 아닙니다. Ubuntu 16.04에서는 보통 /etc/cron.daily/logrotate를 통해 주기적으로 실행되므로 해당 파일과 cron 실행 여부를 확인하세요. 다른 버전에서는 systemd 타이머 등 실제 일정이 다를 수 있습니다.
독립된 테스트 로그와 설정 만들기
다음 실습은 운영 로그가 아닌 새 임시 디렉터리를 사용합니다. 같은 셸에서 순서대로 실행하고, 출력된 경로를 확인하세요. 임시 디렉터리와 별도의 상태 파일을 사용하므로 시스템의 기존 logrotate 설정이나 상태를 수정하지 않습니다.
demo_dir=$(mktemp -d)
printf 'first log line\n' > "$demo_dir/app.log"
cat > "$demo_dir/logrotate.conf" <<EOF
$demo_dir/app.log {
daily
rotate 3
missingok
notifempty
compress
delaycompress
create 0600
}
EOF
printf 'Test directory: %s\n' "$demo_dir"
cat "$demo_dir/logrotate.conf"
daily는 하루 단위 교체 조건이고 rotate 3은 이전 로그를 최대 세 번의 회전분까지 보관하는 설정입니다. missingok는 파일이 없을 때 오류를 피하고 notifempty는 빈 로그를 회전하지 않습니다. compress는 이전 로그를 압축하며 delaycompress는 가장 최근에 회전된 로그의 압축을 다음 회전까지 미룹니다. create 0600은 회전 후 새 로그 파일을 만들 때 권한을 지정합니다.
이 예의 설정 파일은 시스템 일정에 등록되지 않으며 실제 애플리케이션이 로그를 쓰지도 않습니다. daily를 설정해도 실행 일정 자체가 만들어지는 것은 아닙니다. 공식 logrotate 매뉴얼에서 설치 버전에 맞는 옵션과 조건을 확인하세요.
시험 실행과 실제 회전 확인하기
먼저 디버그 모드로 설정과 예상 동작을 확인합니다. -d는 로그를 변경하거나 상태 파일을 갱신하지 않습니다. 새 상태 파일에서는 아직 회전 시기가 아니라고 나올 수 있습니다.
logrotate -d -s "$demo_dir/state" "$demo_dir/logrotate.conf"
실습 파일에서만 강제 회전을 실행하고 결과를 확인합니다. -f는 조건이 되지 않아도 회전을 강제하므로 실제 운영 로그에 무심코 사용하면 안 됩니다.
logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
cat "$demo_dir/app.log.1"
성공하면 원래 내용이 app.log.1에 있고 새 app.log가 생성됩니다. 가장 최근 회전분은 delaycompress 때문에 아직 압축되지 않습니다. 새 로그에 내용을 추가한 뒤 한 번 더 강제 회전하면 이전 회전분이 보통 app.log.2.gz로 압축됩니다.
printf 'second log line\n' >> "$demo_dir/app.log"
logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
gzip -cd "$demo_dir/app.log.2.gz"
마지막 명령에서 첫 번째 로그 줄을 확인할 수 있습니다. 이 연습은 로그를 기록하는 실행 중인 서비스를 재현하지 않습니다. 실습이 끝나면 출력해 둔 임시 경로를 확인하고 필요 없어진 파일을 정리하세요.
운영 서비스에 적용할 때
운영 중인 프로그램은 로그 파일을 이름 변경한 뒤에도 이전 파일에 계속 기록할 수 있습니다. 해당 서비스가 로그 파일을 다시 열도록 제공하는 절차와 기존 패키지의 postrotate 스크립트를 확인하고, 새 파일의 소유자·그룹·권한이 서비스에 맞는지 검토하세요. 기존 Apache 규칙을 변경하기 전에는 배포판과 서비스 문서를 확인하고 설정을 백업합니다.
copytruncate는 복사 후 원본을 비우는 방식으로 파일을 다시 열 수 없는 프로그램에 쓰일 수 있지만, 복사와 비우기 사이에 로그가 유실될 수 있습니다. 가능한 경우 서비스가 로그를 다시 여는 방법을 우선 검토하세요. rotate 3은 일수나 용량의 상한이 아니라 회전 보관 개수이므로 보관 정책과 디스크 사용량을 별도로 점검해야 합니다.
회전되지 않을 때 확인하기
- 설정 파일이 전역 설정에 포함되어 있고 대상 경로가 실제 로그와 일치하는지 확인합니다. 빈 파일은
notifempty에서 회전하지 않습니다. - cron 또는 타이머가 실제로 실행되는지, 상태 파일과 주기 조건상 회전이 필요한지 확인합니다.
daily는 하루에 한 번 검사되는 환경에서 매일 정확한 시각의 회전을 보장하지 않습니다. - 디버그 출력과 스케줄러의 오류 로그에서 권한, 소유자, 문법 및 중복 경로 문제를 살펴봅니다. 운영 로그에
-f를 적용하기 전에 결과와 복구 계획을 검토하세요.




