GrepBoard/매뉴얼
51 편 ·

logrotate 설정을 만들고 미리 시험하기

·logrotate 3.21.0 · Ubuntu 24.04 · systemd 255·6 단계

앱 로그용 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 에 둘 파일입니다.

/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 에 대해 복사와 비우기 사이에 아주 짧은 틈이 있어 일부 로그가 유실될 수 있다고 적고 있습니다.

/etc/logrotate.d/myapp
/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 줄은 생략).

console
# 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 로 강제 실행합니다. 주기와 상관없이 회전하며, 상태 파일이 갱신됩니다. 첫 회전 뒤 파일 크기(바이트)와 이름입니다.

console
# 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.log

delaycompress 때문에 app.log.1 은 아직 압축되지 않았습니다. 로그를 한 줄 더 쓰고 다시 강제 실행하면 압축됩니다.

console
# 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 를 읽습니다.

console
$ systemctl list-timers logrotate.timer

패키지의 유닛 파일에는 OnCalendar=daily 와 Persistent=true(놓친 실행 만회)가 있고, 서비스는 ExecStart=/usr/sbin/logrotate /etc/logrotate.conf 입니다.

#logrotate#logs