logrotate를 이용해 시스템 로그가 쌓여 디스크 용량이 부족해지는 것을 사전에 방지하는 방법을 알아보자.
개요
리눅스 서버를 운영하다 보면
로그 파일이 지속적으로 누적되면서 루트 파티션(/)의 디스크 사용률이 급격히 증가하는 상황이 발생할 수 있다.
특히 시스템 로그가 저장되는 /var/log 디렉터리는
별도의 관리 정책이 없을 경우 장기간 누적되어 디스크 공간을 빠르게 소모하게 된다.
아래는 이러한 상황에서 자주 확인할 수 있는 디스크 사용 현황 예시이다.
$ df -h
...
/dev/mapper/centos-root 49G 50G 1G 98% /
/dev/mapper/centos-home 418G 11G 407G 3% /home
...
디스크 사용량을 분석해 보면,
시스템 로그가 저장되는 /var/log/messages 파일이 과도하게 증가한 경우를 확인할 수 있다.
$ ls -lh /var/log/messages
-rw------- 1 root root 43G messages
이와 같은 상황을 방지하기 위해서는
시스템 로그 파일에 대한 주기적인 회전 및 보관 정책을 사전에 구성하는 것이 필요하다.
/var/log/messages의 역할
/var/log/messages 는 단일 애플리케이션 로그가 아니라,
다음과 같은 로그들이 rsyslog를 통해 집계되는 시스템 로그 파일이다.
- 커널 메시지
- systemd 서비스 로그
- cron, 보안, 네트워크 관련 로그
- 각종 데몬의 informational 로그
등이 rsyslog를 통해 모두 모이는 "시스템 종합 로그" 이다.
응급 조치: messages 로그 내용 비우기
이미 서비스들이 해당 로그 파일을 열고(write 중) 있는 상태였기 때문에
rm /var/log/messages 는 절대 하면 안 된다.
삭제하면:
- 파일은 사라지지만
- 프로세스가 열린 파일 디스크립터(fd)를 계속 잡고 있어서
- 디스크 용량이 반환되지 않는다
올바른 방법: truncate
: > /var/log/messages
또는
> /var/log/messages
이 명령은:
- 파일 자체는 유지
- inode 유지
- 열려 있는 fd 유지
- 내용만 0바이트로 잘라냄
즉시 디스크 공간이 복구된다.
$ df -h
/dev/mapper/centos-root 50G 5.6G 45G 12% /
logrotate 설정하기
logrotate를 사용하면 로그 파일을 주기적으로 회전시켜 용량 증가를 제어하고, 디스크 사용으로 인한 장애를 사전에 방지할 수 있다.
CentOS 7 기준으로 logrotate 는 기본 패키지에 포함되어 설치되어 있다.
$ rpm -q logrotate
logrotate-3.8.6-19.el7.x86_64
또한 설치와 동시에 다음 경로에 cron.daily 작업이 등록된다.
/etc/cron.daily/logrotate
해당 스크립트는 하루 1회 logrotate 를 실행하며,
아래 파일을 기준으로 로그 회전을 수행한다.
/etc/logrotate.conf
└─ /etc/logrotate.d/*
다만 /etc/logrotate.d/ 하위 파일에 rotate 방식을 설정해주어야 rotate가 정상적으로 수행된다.
아래는 시스템 로그에 대해서
하루에 1번 씩, 최대 30개 로그를 날짜형식으로 rotate하는 예시다.
/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
daily # 하루에 한 번 로그 회전
rotate 30 # 최대 30개 로그 파일 유지
missingok # 로그 파일이 없어도 오류 없이 진행
notifempty # 로그가 비어 있으면 회전하지 않음
dateext # 로그 파일명에 날짜 확장자 사용
dateformat -%Y%m%d # YYYYMMDD 형식으로 날짜 지정
sharedscripts # postrotate 스크립트를 한 번만 실행
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
# 로그 파일이 교체된 후 rsyslog에 새 파일을 다시 열도록 요청
endscript
}
시스템 로그는 서버 운영 과정에서 자연스럽게 생성되며,
별도의 관리 정책이 없다면 디스크 용량을 지속적으로 소모하게 된다.
logrotate를 활용해 로그 회전 주기와 보관 개수를 명확히 정의하면,
디스크 용량 부족으로 인한 장애를 사전에 예방할 수 있다.
한국 서버 개발자