La foret rouge

오래된 로그 파일 정리로 용량 확보하기

Published on
Published on

운영 중이던 서버 중 한 대에서 디스크 사용률 경고 알람이 발생한 적이 있습니다. 폴더별 사용량을 확인하다 보니 로그 디렉토리가 경로가 제일 컸고, 수 년 전 로그도 보관 중인 상황이었습니다. 데이터 파티션이기도 했고, 경고 알람으로 상황을 인지하고 조치를 취했기 때문에 장애로 이어지지는 않았지만 루트 파티션이었다면 디스크 공간 부족은 문제가 될 수도 있는 상황입니다.

서버를 운영하면서 발생하는 로그는 문제 분석에 유용하게 사용될 수 있는 데이터이기 때문에 보존이 필요합니다. 하지만 서버 용량에도 한계가 있기 때문에 무한정 모을 수는 없죠. 때문에 보관 주기 정책을 세워서 관리해야 합니다. 그래서 서비스 담당자와 협의하여 "1년 이상 된 로그는 삭제", "30일 이상 된 로그는 압축"이라는 보관 주기 정책을 세우고 적용하여 수십 GB 용량을 확보할 수 있었습니다.

이번 글에서는 Rocky Linux 서버에서 로그를 자동으로 정리하는 방법을 적용해보겠습니다.

수동 실행

먼저 find 명령어를 사용해 일회성으로 정리할 수 있습니다.

> cd /app/log
> find . -name "*.log" -type f -mtime +365 -exec rm -f {} \;
> find . -name "*.log" -type f -mtime +30 ! -name "*.gz" -exec gzip {} \;
  1. 로그 파일이 저장되는 경로로 이동해
  2. find 명령어로 ~~.log라는 이름을 가진 파일만 조회하는데
  3. mtime(modify, 수정 시간)이 365일 이상 된 파일은 rm 명령어로 삭제하고
  4. mtime이 30일 이상 된 것 중 파일명이 ~~.gz가 아닌 것만 gzip으로 압축합니다.
    • 그러면 ~~.log.gz가 되니 한 번 압축한 파일은 다시 압축되지 않습니다.

자동화

매일 서버에 접속해 명령어를 직접 실행할 수는 없으니 이 명령어를 shell script로 만들고 cron으로 매일 0시 10분에 자동 실행되도록 등록합니다. LOG_DIR 경로는 적절히 수정합니다.

compress_and_delete_logs.sh
#! /bin/bash
LOG_DIR="/app/log"
find "$LOG_DIR" -name "*.log" -type f -mtime +365 -exec rm -f {} \;
find "$LOG_DIR" -name "*.log" -type f -mtime +30 ! -name "*.gz" -exec gzip {} \;

이 스크립트에 실행 권한을 주고 cron에 등록해줍니다.

> chmod u+x /app/compress_and_delete_logs.sh
> crontab -e
10 0 * * * /app/compress_and_delete_logs.sh

분 시 일 월 요일 명령어 형식이므로 0시 10분에 실행할 계획이므로 위와 같이 등록합니다. 단, 실제 적용 시에는 이렇게 바로 적용하지 말고 1~2분 뒤 시간으로 설정하여 실제로 정해진 시각에 실행 되는지 확인한 후 원하는 시각으로 변경해주는 것이 좋습니다.