로그 파일 용량이 커질 때 해결하기

일단 해볼게·2023년 12월 15일
1

Springboot

목록 보기
7/26

배포를 하고 로그 파일이 쌓이다보니 EC2 디스크 용량이 꽉 차서 서버가 실행되지 않는 상황이 발생했다. 따라서 로그 파일을 하루에 한 번 체크해서 EC2 디스크 용량이 적어지면 S3에 압축해서 저장하고 로그를 초기화하는 shell script를 만드려고 한다.

해결 방법

S3에 저장하기 위해 AWS CLI 설치

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

curl을 사용하여 설치 스크립트를 다운로드한다.

unzip awscliv2.zip

unzip을 사용하여 다운로드 받은 파일을 압축 해제한다.

sudo ./aws/install

설치 스크립트를 실행한다.

shell script 생성

#!/bin/bash

# 디스크 여유 공간 확인
available_space=$(df -P | grep -v ^Filesystem | awk '{sum += $4} END { print sum/1024/1024}')

# AWS S3 버킷 이름과 파일 경로 설정
bucket_name="yourbucketname"

debug_log="/home/ec2-user/logs/debug.log"
error_log="/home/ec2-user/logs/error.log"
info_log="/home/ec2-user/logs/info.log"
warn_log="/home/ec2-user/logs/warn.log"
nginx_access_log="/home/ec2-user/logs/nginx/access.log"
nginx_error_log="/home/ec2-user/logs/nginx/error.log"

# 1GB 미만인 경우 실행
if (( $(echo "$available_space < 1" | bc -l) )); then
    # 파일 압축하여 S3에 업로드
    gzip -c "$debug_log" | aws s3 cp - s3://$bucket_name/logs/debug_$(date +%Y%m%d%H%M%S).log.gz
    gzip -c "$error_log" | aws s3 cp - s3://$bucket_name/logs/error_$(date +%Y%m%d%H%M%S).log.gz
    gzip -c "$info_log" | aws s3 cp - s3://$bucket_name/logs/info_$(date +%Y%m%d%H%M%S).log.gz
    gzip -c "$warn_log" | aws s3 cp - s3://$bucket_name/logs/warn_$(date +%Y%m%d%H%M%S).log.gz
    gzip -c "$nginx_access_log" | aws s3 cp - s3://$bucket_name/logs/nginx_access_$(date +%Y%m%d%H%M%S).log.gz
    gzip -c "$nginx_error_log" | aws s3 cp - s3://$bucket_name/logs/nginx_errors_$(date +%Y%m%d%H%M%S).log.gz

    # 파일 초기화
    sudo truncate -s 0 "$debug_log"
    sudo truncate -s 0 "$error_log"
    sudo truncate -s 0 "$info_log"
    sudo truncate -s 0 "$warn_log"
    sudo truncate -s 0 "$nginx_access_log"
    sudo truncate -s 0 "$nginx_error_log"

    echo "실행이 완료되었습니다."

fi

df -P | grep -v ^Filesystem | awk '{sum += $4} END { print sum/1024/1024}'

리눅스 명령어로 디스크 여유 공간을 확인한다. 실행 조건을 디스크 여유 공간으로 잡을지, 로그 파일 용량의 합으로 잡을지 고민하다가 디스크 여유 공간에 따라 서버 실행 여부가 결정되어서 전자로 결정했다.

AWS S3 버킷 이름을 입력하고 로그 경로와 S3에 업로드 할 경로를 원하는 경로로 지정하면 된다.

truncate -s 0 "$debug_log"은 파일을 삭제하는게 아니라 용량을 0으로 만들어 로그 파일 자체를 초기화시킨다.

EC2에서 S3에 접근하기 위해 인증하기

쉘 스크립트를 작성하고 실행하려는데 upload failed: Unable to locate credentials. 오류가 발생했다.

이를 해결하기 위해 EC2 터미널에 aws configure 을 입력한다.

AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]:

4가지를 입력한다. Default output format은 필수가 아니라 엔터치고 넘어갔다.

💡 AWS Access Key ID, AWS Secret Access Key : [참고 링크](https://hyunki99.tistory.com/94)

Default region name : S3 region 이름

스크립트 파일 권한 부여

chmod +x log_controller.sh

스크립트 파일에 실행 권한을 부여한다.

Cron 작업 설정

crontab -e
0 0 * * * /home/ec2-user/src/main/resources/backend-config/log_controller.sh

스크립트가 매일 한 번 실행되도록 cron 작업을 설정한다.

결과

성공!

추가로 로그 폴더 경로에서 du -hs * 를 입력하면 현재 폴더에 있는 폴더 또는 파일 용량을 볼 수 있다. 로그 용량이 가득차는 주기가 짧아지면 로그 크기에 따라 스크립트 파일을 실행하도록 변경해야겠다.

참고

https://ysyun0201.tistory.com/16

https://inpa.tistory.com/entry/LINUX-📚-디스크-명령어-정리-df-du-용량-구하기

https://hyunki99.tistory.com/94

https://soundprovider.tistory.com/entry/ubuntu-파일-폴더-용량-확인

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글