/엔지니어/Linux / Shell/logrotate 완전 가이드 — 로그 자동 순환과
Linux / Shell중급linuxlogrotatelogsrotation

logrotate 완전 가이드 — 로그 자동 순환과 압축

logrotate로 로그 파일을 자동 순환·압축·보관하는 방법을 설명합니다. /etc/logrotate.conf와 /etc/logrotate.d 구조, rotate·size·compress·postrotate 지시어, copytruncate vs create 방식, cron/systemd 연동, 디버깅까지 다룹니다.

logrotate 란?

서버를 오래 돌리면 /var/log 아래 로그 파일이 끝없이 커집니다. 방치하면 디스크가 가득 차 서비스가 멈추고, 수 GB짜리 단일 로그는 검색조차 어렵습니다. logrotate는 이 문제를 자동화하는 표준 도구로, 정해진 주기나 크기마다 로그를 새 파일로 순환(rotate) 하고, 오래된 것은 압축·삭제합니다.

순환의 기본 개념은 다음과 같습니다.

CODE
app.log         ← 현재 기록 중
app.log.1       ← 직전 분량
app.log.2.gz    ← 더 오래된 것 (압축됨)
app.log.3.gz
...

새 파일이 생기면 번호가 하나씩 밀리고, 보관 한도를 넘은 가장 오래된 파일은 삭제됩니다.


동작 방식과 실행 주기

logrotate는 데몬이 아니라, cron 또는 systemd 타이머가 하루 한 번 실행하는 일회성 명령입니다.

배포판트리거
전통적/etc/cron.daily/logrotate
systemd 기반logrotate.timerlogrotate.service
Bash
# systemd 타이머 확인
systemctl list-timers logrotate.timer
systemctl status logrotate.timer

설정 진입점은 /etc/logrotate.conf이며, 이 파일이 마지막에 include /etc/logrotate.d로 개별 설정 디렉터리를 읽어들입니다. 패키지나 애플리케이션별 설정은 /etc/logrotate.d/ 안에 파일로 두는 것이 표준입니다.


전역 기본값 — /etc/logrotate.conf

CODE
# 주 단위 순환
weekly

# 4개 보관 (약 4주치)
rotate 4

# 순환 후 빈 새 로그 파일 생성
create

# 순환 파일에 날짜 확장자 사용 (app.log-20260618)
dateext

# 순환된 파일 압축
compress

# 개별 설정 포함
include /etc/logrotate.d

/etc/logrotate.d의 개별 설정에서 같은 지시어를 다시 쓰면 전역값을 덮어씁니다.


개별 설정 작성 — /etc/logrotate.d/myapp

웹 애플리케이션 로그를 예로 든 실전 설정입니다.

CODE
/var/log/myapp/*.log {
    daily
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    dateext
    create 0640 appuser appgroup
    sharedscripts
    postrotate
        systemctl reload myapp >/dev/null 2>&1 || true
    endscript
}

각 지시어의 의미:

지시어역할
daily / weekly / monthly순환 주기
rotate 1414개까지 보관 후 삭제
missingok로그 파일이 없어도 오류 없이 넘어감
notifempty비어 있으면 순환하지 않음
compress순환 파일을 gzip 압축
delaycompress가장 최근 순환본은 압축을 한 주기 미룸
dateext번호 대신 날짜를 확장자로
create 0640 user group새 로그를 지정 권한/소유자로 생성
sharedscripts와일드카드 매칭 파일 전체에 스크립트 1회만 실행
postrotate ... endscript순환 직후 실행할 명령

크기 기반 순환

시간이 아니라 크기로 자르고 싶을 때 사용합니다.

CODE
/var/log/nginx/access.log {
    size 100M
    rotate 10
    compress
    missingok
    create 0640 www-data adm
    postrotate
        # nginx에 새 로그 파일을 열라고 신호
        [ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
    endscript
}
지시어의미
size 100M100MB를 넘으면 순환(주기 무관, 매 실행 시 크기 검사)
maxsize 100M주기 도래 전이라도 이 크기 넘으면 순환
minsize 10M주기가 됐어도 이 크기 미만이면 순환 안 함

size만 쓰면 daily/weekly 같은 시간 조건을 무시합니다. "주마다 또는 100MB 넘으면"을 원하면 weekly + maxsize 100M를 함께 쓰세요.


create 방식 vs copytruncate 방식

순환의 가장 중요한 두 전략입니다. 애플리케이션이 로그 파일을 다루는 방식에 따라 골라야 합니다.

방식동작적합한 경우
create (기본)기존 파일을 mv로 옮기고 새 파일 생성앱이 postrotate에서 reopen 신호(SIGHUP 등)를 받을 수 있을 때
copytruncate원본을 복사한 뒤 원본을 0바이트로 truncate앱을 재시작/신호 처리할 수 없고 파일 핸들을 계속 잡고 있을 때
CODE
/var/log/legacy-app/output.log {
    daily
    rotate 7
    compress
    copytruncate
}

create 방식인데 앱에 reopen 신호를 보내지 않으면, 앱은 mv로 옮겨진(이미 이름이 바뀐) 옛 파일 핸들에 계속 기록합니다. 그 결과 새 app.log는 비어 있고 디스크는 줄지 않습니다. 신호를 못 보내는 앱이라면 copytruncate를 쓰되, 복사~truncate 사이 짧은 순간에 기록된 로그는 유실될 수 있다는 점을 감안하세요.


prerotate / postrotate 스크립트

순환 전후로 명령을 실행합니다. 서비스에 새 파일을 열도록 신호를 보내는 데 주로 씁니다.

CODE
postrotate
    # systemd 서비스 reload
    systemctl reload rsyslog >/dev/null 2>&1 || true
endscript

sharedscripts가 없으면 와일드카드로 매칭된 파일마다 스크립트가 반복 실행됩니다. 서비스 reload는 보통 한 번이면 되므로 sharedscripts를 함께 쓰는 것이 일반적입니다.


테스트와 디버깅

설정을 바꾸면 실제 cron을 기다리지 말고 즉시 검증하세요.

Bash
# 1) 무엇이 일어날지 보기만 함 (실제 순환 X) — 가장 자주 씀
logrotate --debug /etc/logrotate.d/myapp

# 2) 강제로 지금 순환 (주기/크기 조건 무시)
sudo logrotate --force /etc/logrotate.d/myapp

# 3) 전체 설정 강제 실행
sudo logrotate --force /etc/logrotate.conf

# 4) 마지막 순환 시각 기록 확인
cat /var/lib/logrotate/logrotate.status

--debug--verbose를 포함하면서 아무 것도 실제로 바꾸지 않습니다. 운영 서버에서 설정을 확인할 때 안전한 첫 단계입니다. 실제 동작이 안 될 때는 status 파일에서 해당 로그의 마지막 순환 날짜가 갱신됐는지 확인하세요.


자주 겪는 문제

증상원인 / 해결
순환은 됐는데 디스크가 안 줄어듦create 방식 + reopen 신호 누락 → copytruncate 또는 postrotate 신호 추가
권한 오류로 새 로그 생성 실패create 권한·소유자 지정, 상위 디렉터리 권한 확인
설정이 무시됨/etc/logrotate.d/ 파일에 실행권한·확장자 문제 또는 .conf에 미포함. 파일명에 .(점) 주의
"skipping ... because parent directory has insecure permissions"su user group 지시어 추가하거나 디렉터리 권한 교정
압축 파일이 1개 부족delaycompress 때문(가장 최근본은 다음 주기에 압축) — 정상 동작

정리

항목핵심
실행 주체cron.daily 또는 logrotate.timer (데몬 아님)
설정 위치전역 /etc/logrotate.conf, 개별 /etc/logrotate.d/
주기daily/weekly/monthly 또는 size/maxsize
보관 개수rotate N
압축compress + delaycompress
새 파일 처리create(신호 필요) vs copytruncate(신호 불가 앱)
후처리postrotate ... endscript + sharedscripts
검증logrotate --debug, --force

logrotate는 거의 모든 리눅스 서버에 기본 탑재된 만큼, 새 서비스를 배포할 때 /etc/logrotate.d/에 설정 한 장을 함께 넣는 습관을 들이면 디스크 풀로 인한 장애를 근본적으로 예방할 수 있습니다.

#logrotate#logs#rotation#cron#maintenance
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서GNU/Linux man 페이지

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.