오늘도 기록하는 중 GitHub

Linux

시스템 로그 분석 및 모니터링(logrotate)

YongE 2025. 5. 15. 14:13

로그는 중요하다


로그 파일은 시스템 관리자가 서버의 상태를 파악하고 문제를 해결하는 데 필수적인 정보를 제공한다. 웹 서버, 애플리케이션 서버, 데이터베이스 등 모든 서비스는 자신의 활동을 로그 파일에 기록한다. 이러한 로그 파일들은 시간이 지날수록 크기가 커지게 되는데, 방치하면 디스크 공간을 빠르게 소진시켜 시스템 장애를 일으킬 수 있다.

Logrotate란 무엇인가

Logrotate는 리눅스 시스템에서 로그 파일을 자동으로 관리하고 압축, 백업, 삭제, 로테이션 등을 수행하는 유틸리티다
로그 파일이 지나치게 커지는 것을 방지하고, 디스크 공간을 효율적으로 관리할 수 있게 도와준다
대부분의 리눅스 배포판에는 logrotate가 기본적으로 포함되어 있으며, 필요한 경우 패키지 관리자를 통해 쉽게 설치할 수 있다

Logrotate의 주요 기능

Logrotate는 다음과 같은 핵심 기능을 제공한다

  • 로그 파일의 주기적인 순환(rotation)
  • 로그 파일의 압축
  • 오래된 로그 파일의 자동 삭제
  • 파일 권한 및 소유자 관리
  • 로그 백업 및 아카이빙
  • 이메일 알림 기능

Logrotate 파일 구조와 동작 방식

파일 구조

Logrotate는 다음과 같은 파일 구조를 가진다

  • 데몬 프로그램 /usr/sbin/logrotate
  • 메인 설정 파일 /etc/logrotate.conf
  • 개별 서비스 설정 디렉토리 /etc/logrotate.d/
  • 상태 파일 /var/lib/logrotate.status
  • Cron 설정 /etc/cron.daily/logrotate

동작 프로세스 시각화

[Cron 작업] → [logrotate 명령 실행] → [logrotate.conf 읽기] → [logrotate.d/* 파일 읽기] → [로그 파일 처리]

동작 방식

Logrotate는 기본적으로 Cron에 의해 주기적으로 실행된다
대부분의 리눅스 배포판에서는 /etc/cron.daily/logrotate 스크립트를 통해 매일 실행된다
실행 시 /etc/logrotate.conf 파일과 /etc/logrotate.d/ 디렉토리 내 설정 파일들을 읽어 각 로그 파일에 대한 설정에 따라 로테이션 작업을 수행한다

기본 동작 순서는 다음과 같다

  1. crontab에 의해 정해진 시간에 logrotate가 실행됨
  2. /etc/logrotate.conf 설정 파일 읽기
  3. /etc/logrotate.d/ 디렉토리의 개별 설정 파일 읽기
  4. 로그 파일 순환, 압축, 삭제 등의 작업 수행
  5. 작업 결과를 /var/lib/logrotate.status 파일에 기록

Logrotate 설정 방법

기본 설정 파일 - logrotate.conf

/etc/logrotate.conf 파일은 logrotate의 전체적인 기본 설정을 정의한다
기본 설정 예시는 다음과 같다

# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

주요 설정 옵션

Logrotate의 주요 설정 옵션은 다음과 같다

  • 주기 설정
    • daily 매일 로그 순환
    • weekly 매주 로그 순환
    • monthly 매월 로그 순환
    • yearly 매년 로그 순환
  • 파일 관리
    • rotate 숫자 보관할 로그 파일 개수 설정
    • size 크기 특정 크기(k, M, G 단위로 지정)에 도달하면 로테이션 실행
    • maxage 숫자 지정된 일수 이후 로그 파일 삭제
  • 파일 처리 옵션
    • compress 순환된 로그 파일을 gzip으로 압축
    • delaycompress 다음 로테이션 때까지 압축을 지연
    • notifempty 빈 로그 파일은 순환시키지 않음
    • missingok 로그 파일이 없어도 오류 발생시키지 않음
  • 파일 생성 및 권한
    • create 권한 사용자 그룹 새 로그 파일 생성 시 권한, 소유자, 그룹 설정
    • copytruncate 원본 파일을 복사 후 비움(짧은 시간에 일부 로그 유실 가능)
    • dateext 파일명에 날짜 추가 (YYYYMMDD 형식)
  • 스크립트 실행
    • prerotate/endscript 로그 순환 전 실행할 스크립트
    • postrotate/endscript 로그 순환 후 실행할 스크립트

개별 서비스 설정하기

특정 서비스나 애플리케이션의 로그 파일에 대한 설정은 /etc/logrotate.d/ 디렉토리에 별도의 파일로 관리한다
Nginx 웹 서버의 로그 설정 예시

/var/log/nginx/*.log {
    daily                   # 매일 로그를 회전한다
    rotate 7               # 최근 7일간의 로그를 유지한다
    missingok              # 로그 파일이 없어도 오류를 발생시키지 않는다
    notifempty             # 로그 파일이 비어 있으면 회전하지 않는다
    compress               # gzip 압축을 적용한다
    delaycompress          # 하루가 지난 로그부터 압축한다
    dateext                # 파일명에 날짜를 추가한다
    copytruncate           # 기존 로그 파일을 유지하면서 내용을 비운다
    postrotate             # Nginx 프로세스에 로그 변경을 알린다
        kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Apache 로그 설정 예시

Apache 웹 서버의 로그 설정 예시

/var/log/apache2/*.log {
    missingok             # 로그 파일이 없어도 경고 없이 처리
    daily                 # 로그 파일을 매일 로테이션
    rotate 14             # 로그 파일이 최대 14개까지 유지
    compress              # 로그 파일을 압축
    notifempty            # 원본 로그 파일과 함께 삭제
    maxage 30             # 30일 이후의 로그 파일은 삭제
    copytruncate          # 로그 파일을 복사하면서 원본 파일 비우기
    dateext               # 압축된 로그 파일에 날짜 확장자 추가
    create 0644 root root # 로그 파일의 소유자와 그룹을 지정
}

Logrotate 실행 및 관리

수동으로 Logrotate 실행하기

Logrotate를 수동으로 실행하는 방법은 다음과 같다

# 모든 설정에 대해 logrotate 실행
sudo logrotate /etc/logrotate.conf

# 특정 서비스에 대해서만 실행
sudo logrotate /etc/logrotate.d/nginx

# 강제로 실행 (조건과 관계없이 로테이션 수행)
sudo logrotate -f /etc/logrotate.conf

# 디버그 모드로 실행 (실제로는 실행하지 않고 어떤 작업이 수행될지 표시)
sudo logrotate -d /etc/logrotate.conf

Cron을 이용한 자동 실행

기본적으로 logrotate는 cron.daily에 의해 매일 실행되지만, 원하는 주기로 변경할 수 있다

# 해당 명령어 실행
sudo crontab -e

# 아래 문장을 복사 붙여넣고, 저장
# 의미 = 매주 수요일 오전 2시에 logrotate 실행
0 2 * * 3 /usr/sbin/logrotate /etc/logrotate.conf

실행 상태 확인

Logrotate의 실행 상태 및 마지막 실행 정보는 다음 파일을 통해 확인할 수 있다

# 마지막 실행 로그 보기
cat /var/lib/logrotate/status

실전 응용 사례

도커 환경에서 Logrotate 설정

도커 컨테이너 내부에서 Nginx 로그 파일을 관리하는 설정

## 1. logrotate 설정 파일 작성
# nginx/logrotate-nginx 설정 파일
/var/log/nginx/*.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    dateext
    copytruncate
    postrotate
        kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

## 2. cron 스크립트 추가
# nginx/logrotate-cron.sh
#!/bin/sh
# logrotate 크론 작업 추가
echo "0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx" > /etc/crontabs/root
# 크론 서비스 실행
crond -b -l 2

대용량 로그 파일 처리

대용량 로그 파일을 효율적으로 관리하는 설정

# copytruncate 옵션 사용 시 주의점
# 대용량 파일의 경우 copy 작업 동안 I/O 부하가 발생할 수 있음
/var/log/large-application.log {
    size 100M            # 100MB 이상이 되면 로테이션
    rotate 10            # 10개 로그 파일 유지
    compress             # 압축
    delaycompress        # 다음 로테이션 때까지 압축 지연
    missingok
    notifempty
    dateext              # 날짜 포함 파일명
    create 0644 appuser appgroup
}

커스텀 스크립트 실행

로그 로테이션 전후에 특정 작업을 수행하는 설정

/var/log/myapp.log {
    daily
    rotate 30
    compress
    missingok
    create 0644 myappuser myappgroup
    prerotate
        # 로테이션 전 수행할 작업 (예: 애플리케이션 알림)
        echo "Log rotation starting" | mail -s "Log Rotation" admin@example.com
    endscript
    postrotate
        # 로테이션 후 수행할 작업 (예: 서비스 재시작)
        systemctl reload myapp
    endscript
}

고급 기술과 팁

size와 time 옵션 조합하기

크기와 시간 기반 로테이션을 함께 사용하는 방법

/var/log/application.log {
    daily               # 매일 검사
    size 100M           # 하지만 100MB가 넘었을 때만 로테이션
    rotate 14
    compress
    notifempty
}

dateformat 옵션 사용하기

로그 파일 이름에 사용자 정의 날짜 형식 적용하기

/var/log/custom-app.log {
    daily
    rotate 30
    dateext
    dateformat -%Y%m%d-%s  # 년월일-타임스탬프 형식으로 저장
    compress
    missingok
}

sharedscripts 옵션 활용하기

여러 파일에 대해 스크립트를 한 번만 실행

/var/log/netdata/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
    sharedscripts       # 여러 파일이 매칭되더라도 스크립트는 한 번만 실행
    postrotate
        /bin/kill -HUP `cat /var/run/netdata/netdata.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

logrotate 과정

위 과정이 어떤 순서로 이뤄지는지 시각화해보았다.

[원본 로그] → [크기 또는 시간 기준 확인] → [조건 충족 시 로테이션] → [압축 및 이름 변경] → [새 로그 파일 생성] → [기존 로그 파일 처리

logrotate 실사용


직접 사용해보고자 VM 구성하고 파일을 작성한 뒤에 다음과 같은 디버깅 명령어를 실행했다.

실제로 로그를 회전시키지 않고 설정이 제대로 적용되는지, 실행된다면 어떤 작업이 수행되는지 보여준다.
sudo logrotate -d /etc/logrotate.conf

결과는 다음과 같다.

어떤 식으로 진행됐는지 볼 수 있다.

반응형

'Linux' 카테고리의 다른 글

리눅스 커널 모듈  (0) 2025.05.15
리눅스  (0) 2025.04.28
Shell  (0) 2025.04.23