본문 바로가기

Server Story....

리눅스 서버의 숨은 해결사: Logrotate로 디스크 풀(Full) 완벽 방지하기

반응형

Logrotate로 디스크 풀(Full) 완벽 방지


1. 도입 및 배경 (Why?)

서버를 운영하다 보면 분명 어제까진 멀쩡하던 서비스가 갑자기 죽는 경우가 있음. 원인을 파악하려 로그를 보려 해도 No space left on device 에러만 출력되며 터미널조차 제대로 작동하지 않음.

범인은 대개 **'로그 파일'**임. 서비스가 내뿜는 로그가 무한정 쌓여 디스크 전체를 점령해버린 것임. 이때 필요한 것이 바로 Logrotate임. 오래된 로그는 압축하고, 더 오래된 로그는 삭제하여 서버의 '숨통'을 틔워주는 필수 관리 도구임.


2. 시스템 작동 구조 (What?)

Logrotate는 백그라운드에서 주기적으로 실행되며 아래와 같은 워크플로우를 가짐.

Plaintext
 
[Active Log: app.log] --(기준 충족: 크기/날짜)--> [Rotate: app.log.1]
                                                    |
[Delete: app.log.5] <--(Limit 도달)-- [Compress: app.log.2.gz]


3. 사전 준비 및 확인

대부분의 리눅스 배포판(Ubuntu, CentOS 등)에는 기본 설치되어 있음.

Bash
 
# logrotate 설치 여부 확인
logrotate --version

# 기본 설정 파일 위치 확인
ls -l /etc/logrotate.conf      # 전역 설정
ls -l /etc/logrotate.d/        # 개별 서비스 설정 보관함


4. 핵심 작업 단계 (Step-by-Step)

우리가 만든 Blogger 에이전트Nginx의 로그를 관리하기 위한 개별 설정 파일을 생성함.

Bash
 
# 1. 에이전트 전용 로그 로테이트 설정 생성
sudo nano /etc/logrotate.d/blogger-agent

# 2. 아래 내용 작성 (예시)
/var/log/blogger-agent/*.log {
    daily                   # 매일 실행
    missingok               # 로그 파일이 없어도 에러 내지 않음
    rotate 7                # 최대 7개까지만 보관 (일주일치)
    compress                # 용량 절약을 위해 gzip 압축
    delaycompress           # 현재 로그 바로 다음 로그는 압축 지연 (분석 편의)
    notifempty              # 로그 내용이 비어있으면 로테이트 안 함
    create 0640 root root   # 새 로그 파일 생성 시 권한 설정
    sharedscripts           # 와일드카드 사용 시 스크립트 한 번만 실행
    postrotate              # 로테이트 후 서비스 재시작(필요 시)
        /usr/bin/docker restart blogger_bot
    endscript
}


5. 실제 적용 및 디버깅 (Advanced)

설정이 끝났다면 제대로 돌아가는지 **드라이 런(Dry-run)**으로 테스트해야 함. 실제 파일은 건드리지 않고 시뮬레이션만 수행함.

Bash
 
# 설정 파일 문법 및 실행 시뮬레이션
sudo logrotate -d /etc/logrotate.d/blogger-agent

# 강제로 로테이트 실행 (테스트용)
sudo logrotate -f /etc/logrotate.d/blogger-agent


6. 트러블슈팅 및 삽질 기록 (Troubleshooting Log) ★

■ 에러: 권한 문제로 로테이트 실패

  • 상황: 로그 파일의 소유권이 root가 아닌 특정 유저일 때 발생함.
  • 해결: 설정 파일 안에 su root root (혹은 해당 유저명) 옵션을 추가하여 명시적으로 권한을 지정해줘야 함.

■ 에러: postrotate 스크립트 실행 실패

  • 상황: Docker 컨테이너 이름을 찾지 못하거나 경로가 절대경로가 아닐 때 발생.
  • 해결: 반드시 /usr/bin/docker처럼 전체 경로(Full Path)를 사용하고, 실행 권한을 다시 확인할 것.


7. 관련 기록 및 내부 링크

  • [Ubuntu Server - Docker-Compose 인프라 구축]: 로그가 발생하는 서비스 컨테이너 관리법.
  • [Prometheus & Grafana 모니터링]: 디스크 사용량 임계치 알람 설정하기.
반응형