서버 운영
서버 로그가 너무 커지면 디스크가 찬다
서버의 로그 파일이 계속 쌓이다 보면 디스크 공간이 부족해진다. 로그 로테이션 설정으로 자동 정리할 수 있다.
서버의 로그 파일이 몇 개월 방치되면 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로 전송
이렇게 하면 로컬 디스크는 깔끔하게 유지하면서 필요할 때 과거 로그도 조회할 수 있다.