← 전체 글로 돌아가기

서버 운영

서버 로그가 너무 커지면 디스크가 찬다

서버의 로그 파일이 계속 쌓이다 보면 디스크 공간이 부족해진다. 로그 로테이션 설정으로 자동 정리할 수 있다.

서버의 로그 파일이 몇 개월 방치되면 GB 단위로 커진다. 언젠가 갑자기 디스크가 가득 찬다고 알람이 온다. 이전에 미리 대비해야 한다.

현재 로그의 크기를 파악하기

# 로그 디렉토리의 용량
du -sh /var/log/

# 가장 큰 로그 파일들
ls -lhSr /var/log/ | tail -20

# 특정 앱의 로그 크기
du -sh /var/log/myapp/

로그 파일이 1GB를 넘으면 곧 정리해야 한다. 5GB를 넘으면 긴급이다.

logrotate로 자동 정리 설정하기

# logrotate 설정 파일 생성
sudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily                    # 매일
    rotate 7                 # 7개 파일 유지
    compress                 # gzip 압축
    delaycompress            # 오늘 것은 압축 안 함
    notifempty               # 빈 파일은 로테이션 안 함
    create 0644 app_user app_group
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}

이렇게 설정하면 매일 자동으로 로그가 정리되고, 7일치만 유지된다.

logrotate 테스트하기

# 설정이 제대로 작동하는지 테스트
sudo logrotate -d /etc/logrotate.d/myapp

# 실제로 실행해보기
sudo logrotate -f /etc/logrotate.d/myapp

# 로그 파일 확인
ls -la /var/log/myapp/

Dry run으로 먼저 확인한 후 실제 실행한다.

기존 로그 파일 압축하기

# 7일 이상 된 로그 파일 압축
find /var/log/myapp -name "*.log" -mtime +7 -exec gzip {} \;

# 또는 한 번에 모두
gzip /var/log/myapp/app.log.1

# 압축된 파일 확인
ls -lh /var/log/myapp/

텍스트 로그 파일은 gzip으로 압축하면 대부분 10분의 1 정도로 줄어든다.

너무 오래된 로그는 삭제하기

# 30일 이상 된 로그 삭제
find /var/log/myapp -name "*.log.*.gz" -mtime +30 -delete

# 또는 한 달치만 유지
logrotate 설정에서 rotate 30으로 변경

디스크가 부족한 상황이 자주 반복되면 보관 기간을 단축해야 한다.

특정 로그를 더 자주 정리하기

Access 로그는 매우 크지만 덜 중요할 수 있다. 반면 에러 로그는 오래 보관해야 한다.

# Access 로그는 3일 유지
/var/log/myapp/access.log {
    daily
    rotate 3
    compress
}

# 에러 로그는 30일 유지
/var/log/myapp/error.log {
    daily
    rotate 30
    compress
}

파일별로 다른 정책을 설정할 수 있다.

systemd 저널 정리하기

# 저널의 현재 크기
journalctl --disk-usage

# 30일 이상 된 로그 삭제
sudo journalctl --vacuum=days=30

# 또는 크기 제한
sudo journalctl --vacuum=size=1G

Journalctl도 자주 커진다. 정기적으로 정리해야 한다.

앞으로의 모니터링

# 주 1회 로그 크기 확인 스크립트
#!/bin/bash
LOG_SIZE=$(du -sh /var/log/ | awk '{print $1}')
echo "Log size: $LOG_SIZE" | mail -s "Log size report" [email protected]

또는 Monitoring 도구에 알람을 설정한다:

# 디스크 사용량이 80% 이상이면 알람
if [ $(df / | tail -1 | awk '{print $5}' | cut -d% -f1) -gt 80 ]; then
    alert "Disk usage too high"
fi

로그 분석 도구 고려하기

중요한 로그는 중앙 집중식 로그 서버(ELK, Datadog 등)로 보내서 오래 보관하고, 서버의 로그는 최근 것만 유지하는 방식도 있다.

# 로그를 외부 서버로 보내고 로컬은 정리
rsyslog를 이용해 remote syslog server로 전송

이렇게 하면 로컬 디스크는 깔끔하게 유지하면서 필요할 때 과거 로그도 조회할 수 있다.