logrotate를 사용한 로그 파일 관리

logrotate는 Linux 환경에서 로그 파일을 자동으로 회전, 압축, 삭제 및 아카이빙하는 강력한 도구입니다. 이 도구는 로그 파일의 무한한 성장 방지를 위한 방법이며, 디스크 공간을 절약하고 기록을 추적할 수 있도록 도와줍니다. 이 문서에서는 logrotate의 사용법, 설치, 구성, 테스트, 자동화, 일반적인 문제 해결 방법 및 고급 기능을详细介绍합니다.

1. logrotate란 무엇인가?

logrotate는 다음과 같은 작업을 수행하는 시스템 도구입니다:

  • 일정 시간 간격(일, 주, 월) 또는 파일 크기 기준으로 로그 파일을 회전.
  • 구长 로그 파일을 압축(예: .gz 또는 .xz 형식).
  • 구 로그 파일을 삭제하여 디스크 공간을 확보.
  • 회전 후 애플리케이션에 새 로그 파일을 다시 열도록 통지.
  • 사용자 정의 스크립트를 통해 추가 작업 수행(예: 서비스 재시작).

이 도구는 시스템 로그(예: /var/log/syslog)와 웹 서버(예: Nginx, Apache) 로그 및 맞춤형 애플리케이션 로그를 관리하는 데 널리 사용됩니다.

2. logrotate 설치

ほとんどの Linux 배포판(예: Ubuntu, CentOS, Debian)은 기본적으로 logrotate를 설치하고 있습니다. 설치가 필요할 경우 다음 명령어를 사용합니다:

  • Ubuntu/Debian:
sudo apt update
sudo apt install logrotate
  • CentOS/RHEL:
sudo yum install logrotate
  • 설치 확인:
logrotate --version

출력 예:

logrotate 3.18.0

3. logrotate 작동 원리

  • 구성 파일:
  • 주 구성 파일: /etc/logrotate.conf, 전역 회전 규칙을 정의합니다.
  • 하위 구성 파일: /etc/logrotate.d/ 디렉터리에 있는 파일, 특정 로그 파일에 대한 회전 규칙을 정의합니다.
  • 일정 실행:
  • cron 또는 systemd 타이머가 일정 간격으로 실행하여 logrotate를觸发.
  • 작업 단계:
  1. 로그 파일이 회전 조건(시간 또는 크기)을 충족했는지 확인.
  2. 구 로그 파일을 이름이 변경(예: app.logapp.log.1).
  3. 새 로그 파일을 생성.
  4. 구 로그 파일을 압축(예: app.log.1.gz 생성).
  5. 보존 기간이 지난 구 로그 파일을 삭제.
  6. 사용자 정의 스크립트를 실행(예: 애플리케이션 통지).

4. 구성 파일 상세 설명

logrotate의 구성은 전역 구성과 하위 구성으로 이루어져 있습니다. 구성 파일은 단순 텍스트 형식이며, 로그 파일 경로와 회전 규칙을 지정합니다.

4.1 주 구성 파일

/etc/logrotate.conf는 전역 기본 규칙을 정의합니다. 예제:

weekly
rotate 4
create
compress
include /etc/logrotate.d
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}
  • weekly: 기본적으로 주말마다 회전.
  • rotate 4: 4개의 과거 로그 파일을 보존.
  • create: 회전 후 새 로그 파일을 생성.
  • compress: 구 로그 파일을 압축(기본 압축 방식은 gzip).
  • include /etc/logrotate.d: /etc/logrotate.d/ 디렉터리의 하위 구성 파일을 포함.
  • /var/log/wtmp { … }: 특정 로그 파일에 대한 회전 규칙을 정의.

4.2 하위 구성 파일

하위 구성 파일은 /etc/logrotate.d/ 디렉터리에 저장됩니다. 각 파일은 특정 애플리케이션 또는 로그에 대한 규칙을 정의합니다. 예를 들어, /var/log/myapp.log 파일에 대한 규칙을 정의하는 예제:

/var/log/myapp.log {
    daily
    rotate 7
    size 100M
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
    postrotate
        /bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
구성 옵션 설명:
  • /var/log/myapp.log: 회전할 로그 파일 경로(ワイル드카드도 지원, 예: /var/log/myapp/*.log).
  • daily: 매일 회전(기타 옵션: weekly, monthly).
  • rotate 7: 7개의 과거 로그 파일을 보존.
  • size 100M: 로그 파일 크기가 100MB를 초과하면 회전.
  • compress: 구 로그 파일을 압축.
  • delaycompress: 압축을 지연(즉, myapp.log.1은 압축하지 않고 myapp.log.2부터 압축).
  • missingok: 로그 파일이 없으면 오류를 표시하지 않습니다.
  • notifempty: 로그 파일이 비어 있으면 회전하지 않습니다.
  • create 0640 root root: 회전 후 새 파일을 생성하며 권한을 0640, 소유자와 그룹을 root로 설정.
  • postrotate … endscript: 회전 후 스크립트를 실행하며, 여기서는 애플리케이션에 HUP 신호를 보내 새 로그 파일을 열도록 통지.
  • || true: 스크립트가 실패하더라도 logrotate의 실행을 중단시키지 않습니다.

4.3 하위 구성 파일 저장

하위 구성 파일을 创建:

sudo nano /etc/logrotate.d/myapp

上述 구성 내용을 붙여넣고 저장 후 퇴장. 파일 권한을 설정:

sudo chmod 644 /etc/logrotate.d/myapp

5. 일반적인 구성 옵션

logrotate가 지원하는 일반적인 명령어 목록:

  • 시간 제어:
  • daily: 매일 회전.
  • weekly: 매주 회전.
  • monthly: 매월 회전.
  • 크기 제어:
  • size 100M: 파일 크기가 100MB를 초과하면 회전.
  • maxsize 500M: 지정된 크기 이상이면 회전.
  • 파일 관리:
  • rotate <n>: <n>개의 과거 파일을 보존.
  • create <mode> <owner> <group>: 새 파일을 생성할 때의 권한, 소유자, 그룹.
  • nocreate: 새 파일을 생성하지 않습니다.
  • missingok: 파일이 없으면 오류를 표시하지 않습니다.
  • notifempty: 비어 있는 파일은 회전하지 않습니다.
  • 압축:
  • compress: 압축을 사용합니다.
  • nocompress: 압축을 사용하지 않습니다.
  • delaycompress: 압축을 지연합니다.
  • compresscmd /usr/bin/xz: xz를 압축 도구로 사용합니다.
  • compressext .xz: 압축된 파일의 확장자를 .xz로 지정합니다.
  • 스크립트 실행:
  • prerotate/endscript: 회전 전 스크립트를 실행합니다.
  • postrotate/endscript: 회전 후 스크립트를 실행합니다.
  • firstaction/endscript: 일련의 파일을 처리하기 전에 한번 실행합니다.
  • lastaction/endscript: 일련의 파일을 처리한 후에 한번 실행합니다.
  • 기타:
  • mail user@example.com: 회전된 로그를 지정된 이메일로 전송합니다.
  • olddir /path/to/archive: 구 로그 파일을 특정 디렉터리로 이동합니다.
  • maxage 30: 30일 이상된 파일을 삭제합니다.

6. logrotate 테스트

본격적인 운영 환경에서 작업 전에 구성을 테스트합니다:

  • 디버그 모드:
sudo logrotate -d /etc/logrotate.conf
  • -d: 실제 파일을 수정하지 않고 회전 과정을 디버그 모드로 시뮬레이션.
  • 출력을 통해 규칙이 기대한 대로 적용되는지 확인합니다.
  • 강제 실행:
sudo logrotate -f /etc/logrotate.conf
  • -f: 규칙을 즉시 실행하여 변경 사항을 적용합니다.
  • /var/log/ 디렉터리에 새 로그 파일(예: myapp.log)과 압축 파일(예: myapp.log.1.gz)이 생성되었는지 확인합니다.
  • 특정 하위 구성 파일 테스트:
sudo logrotate -d /etc/logrotate.d/myapp

7. 자동화된 회전

logrotate는 보통 일정 작업을 통해 자동 실행됩니다:

  • Cron 작업:
  • 기본적으로 /etc/cron.daily/logrotate 스크립트가 실행됩니다. 내용을 확인:
cat /etc/cron.daily/logrotate

예제 내용:

#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

cron 서비스가 실행 중인지 확인:

sudo systemctl status cron
  • Systemd 타이머(近代 시스템):
  • 일부 시스템은 cron 대신 systemd 타이머를 사용합니다. 타이머 상태를 확인:
systemctl status logrotate.timer

타이머를 활성화하고 시작:

sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
  • 사용자 정의 작업:
  • 더 자주 회전이 필요할 경우 사용자 정의 cron 작업을 생성합니다:
sudo crontab -e

다음과 같이 추가(1시간마다 실행):

0 * * * * /usr/sbin/logrotate /etc/logrotate.conf

8. 실제 응用 예제

다음은 다양한 장면에서의 구성 예제입니다:

8.1 Nginx 로그 회전

Nginx의 접근 로그와 오류 로그를 회전하는 예제:

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
        /usr/sbin/nginx -s reopen
    endscript
}
  • sharedscripts: 일련의 파일에 대해 스크립트를 단 한번만 실행합니다(ワ일드카드와 함께 사용 시 유용).
  • nginx -s reopen: Nginx에게 새 로그 파일을 열도록 통지합니다.

8.2 크기 기준으로 회전

크기로 인해 급증하는 로그 파일에 대한 구성:

/var/log/bigapp.log {
    size 500M
    rotate 5
    compress
    create 0640 root root
    postrotate
        /bin/kill -HUP `cat /var/run/bigapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

8.3 특정 디렉터리로 아카이브

구 로그 파일을 특정 디렉터리로 이동:

/var/log/myapp.log {
    daily
    rotate 7
    compress
    olddir /var/log/archive
    create 0640 root root
}

olddir 디렉터리 설정:

sudo mkdir -p /var/log/archive
sudo chown root:root /var/log/archive
sudo chmod 755 /var/log/archive

9. 일반적인 문제 해결

  • 로그가 회전되지 않음:
  • 구성 파일의 문법을 확인:
sudo logrotate -d /etc/logrotate.conf
  • cron 작업이 실행 중인지 확인:
sudo systemctl status cron
  • 로그 파일의 권한을 확인:
ls -l /var/log/myapp.log
  • notifempty가 활성화된 경우 로그 파일이 비어 있지 않아야 합니다.
  • 애플리케이션 이이 로그 파일을 다시 열지 않음:
  • postrotate 스크립트가 올바르게 작동하는지 확인:
cat /var/run/myapp.pid
  • 애플리케이션에 HUP 신호가 올바르게 전달되는지 확인(애플리케이션 문서 참조).
  • 압축 파일이 많은 디스크 공간을 차지:
  • rotate 값을 줄이거나 더 높은 압축률을 사용합니다:
compresscmd /usr/bin/xz
compressext .xz
  • 구 로그 파일을 삭제합니다:
maxage 30
  • 권한 오류:
  • create가 지정한 사용자와 그룹이 존재하는지 확인.
  • olddir 디렉터리의 권한을 확인.
  • 디버그 로그:
  • logrotate의 실행 로그는 /var/log/syslog 또는 /var/log/messages에 기록됩니다:
grep logrotate /var/log/syslog

10. 고급 기능

  • 다수의 로그 파일 그룹핑:
  • 일련의 로그 파일을 함께 회전:
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
  • 조건式的 회전:
  • 크기와 시간을 조합하여 회전:
/var/log/myapp.log {
    daily
    size 100M
    rotate 7
    compress
}

이 로그는 매일 점검하며, 100MB를 초과하거나 시간이 도달하면 회전합니다.

  • 이메일 통지:
  • 회전된 로그를 이메일로 전송:
/var/log/myapp.log {
    daily
    rotate 7
    mail user@example.com
}
  • 상태 파일:
  • logrotate/var/lib/logrotate/status 파일을 통해 상태를 기록하며, 이 파일을 통해 회전 이력을 확인할 수 있습니다:
cat /var/lib/logrotate/status

상태 파일이 손상되었을 경우 삭제 후 재생성:

sudo rm /var/lib/logrotate/status
sudo logrotate -f /etc/logrotate.conf

11. 최선의 실천 방법

  • 구성 테스트: 항상 -d 디버그 모드로 먼저 테스트后再 운영 환경에서 실행.
  • 권한 관리: 0640과 같은 적절한 파일 권한을 설정하여 민감한 로그 노출을 방지.
  • 로그 아카이빙: Restic와 같은 백업 도구를 사용하여 압축된 로그를 정기적으로 아카이빙.
  • 디스크 사용량 점검: 정기적으로 디스크 사용량을 확인합니다:
df -h /var/log
  • 문서 참조: man logrotate 또는 공식 문서를 통해 더 많은 세부 정보를 확인.

12. 주의 사항

  • 프로세스 호환성: 일부 애플리케이션(예: MySQL)은 특정한 재시작 명령이 필요할 수 있습니다. 애플리케이션 문서를 참조하세요.
  • 디스크 공간: /var/logolddir 디렉터리에 충분한 공간이 확보되어야 합니다.
  • 백업 전략: 회전 후 압축된 로그를 즉시 백업하여 실수로 삭제되는 것을 방지.
  • 중복 회전 피하기: 동일한 로그 파일이 여러 구성 파일에 의해 회전되지 않도록 주의합니다.

태그: logrotate log management cron systemd bash scripting

7월 28일 00:22에 게시됨