logrotate 설정을 만들고 미리 시험하기
앱 로그용 logrotate 설정을 만들고 -d 로 미리 보고, -f 와 상태 파일로 강제 실행해 결과 파일을 확인합니다. copytruncate 와 postrotate 의 차이도 다룹니다.
설정을 /etc/logrotate.d/ 에 넣기 전에 다른 경로에서 먼저 돌려 보는 방법입니다. 아래 출력은 Ubuntu 24.04 에서 logrotate 3.21.0 으로 실제 돌린 결과이고, 경로만 /var/log/myapp · /etc/logrotate.d/myapp 으로 바꿨습니다.
[1] 앱 로그용 설정을 만듭니다. /etc/logrotate.d/myapp 에 둘 파일입니다.
/var/log/myapp/*.log { daily rotate 14 compress delaycompress missingok notifempty copytruncate}| 옵션 | 뜻 |
|---|---|
daily | 하루 한 번 회전 |
rotate 14 | 옛 로그를 14개까지 보관하고 그보다 오래된 것은 지웁니다 |
compress | 옛 로그를 gzip 으로 압축 |
delaycompress | 방금 회전한 파일의 압축을 다음 회전 때로 미룹니다 |
missingok | 로그 파일이 없어도 오류를 내지 않고 넘어갑니다 |
notifempty | 비어 있는 로그는 회전하지 않습니다 |
copytruncate | 파일을 옮기지 않고 복사한 뒤 원본을 0 으로 비웁니다 |
[2] copytruncate 와 postrotate 중 하나를 고릅니다. 프로그램이 로그 파일을 다시 열게 할 수 있으면 postrotate 가 안전하고, 그럴 수 없으면 copytruncate 를 씁니다. man logrotate 는 copytruncate 에 대해 복사와 비우기 사이에 아주 짧은 틈이 있어 일부 로그가 유실될 수 있다고 적고 있습니다.
/var/log/myapp/app.log { daily rotate 14 compress delaycompress missingok notifempty create 0640 root root postrotate systemctl reload myapp.service endscript}postrotate 는 파일을 옮긴 뒤 스크립트를 실행하므로, 스크립트가 로그를 다시 열게 해야 새 파일에 기록됩니다. systemctl reload 줄은 예시입니다. 이 방식에서는 create 가 새 로그 파일을 만듭니다. copytruncate 를 쓰면 create 는 효과가 없습니다.
[3] -d 로 미리 봅니다. -d 는 아무것도 바꾸지 않고 판단 과정만 출력하고, -s 는 상태 파일(로그별 마지막 회전 시각)을 지정합니다. 처음 쓰는 상태 파일은 「방금 회전함」으로 간주되어 log does not need rotating 이 나옵니다. 아래는 이틀 전 시각이 든 상태 파일로 돌린 결과입니다(중간의 renaming 줄은 생략).
# logrotate -d -s /tmp/myapp.state /etc/logrotate.d/myappreading config file /etc/logrotate.d/myappReading state from file: /tmp/myapp.stateHandling 1 logs rotating pattern: /var/log/myapp/*.log after 1 days (14 rotations)empty log files are not rotated, old logs are removedconsidering log /var/log/myapp/app.log Now: 2026-10-19 12:17 Last rotated at 2026-10-17 00:00 log needs rotatingconsidering log /var/log/myapp/empty.log ... log does not need rotating (log is empty)...copying /var/log/myapp/app.log to /var/log/myapp/app.log.1truncating /var/log/myapp/app.log[4] -f 로 강제 실행합니다. 주기와 상관없이 회전하며, 상태 파일이 갱신됩니다. 첫 회전 뒤 파일 크기(바이트)와 이름입니다.
# logrotate -f -s /tmp/myapp.state /etc/logrotate.d/myapp# ls -l /var/log/myapp | tail -n +2 | awk '{print $5, $9}'0 app.log14 app.log.10 empty.logdelaycompress 때문에 app.log.1 은 아직 압축되지 않았습니다. 로그를 한 줄 더 쓰고 다시 강제 실행하면 압축됩니다.
# echo "line 3" >> /var/log/myapp/app.log# logrotate -f -s /tmp/myapp.state /etc/logrotate.d/myapp# ls -l /var/log/myapp | tail -n +2 | awk '{print $5, $9}'0 app.log7 app.log.131 app.log.2.gz0 empty.log[5] postrotate 설정도 같은 방식으로 돌립니다. 스크립트는 -f 로 실제 회전할 때만 실행됩니다. 시험에서는 postrotate 안에 echo "reopen log" >> postrotate.out 을 넣었고, 회전 뒤 postrotate.out 에 reopen log 가 남았고 app.log 는 create 에 적은 권한(-rw-r-----)으로 새로 만들어졌습니다.
[6] 누가 하루 한 번 돌리는지 봅니다. Ubuntu 에서는 logrotate.timer 가 logrotate.service 를 실행하고, 서비스는 /etc/logrotate.conf 를 읽습니다.
$ systemctl list-timers logrotate.timer패키지의 유닛 파일에는 OnCalendar=daily 와 Persistent=true(놓친 실행 만회)가 있고, 서비스는 ExecStart=/usr/sbin/logrotate /etc/logrotate.conf 입니다.