back-end/Monitoring
[Crontab] log backup to S3
icandle
2024. 11. 14. 16:44
Intro
서버에 남겨지는 로그 파일들을 주기적인 배치작업으로 S3에 백업하고자 했다. 간단하게 linux 환경에서 사용할 수 있는 crontab을 사용했다. 로그 작성할때마다 S3에 보내는것 보다는, 서버에 바로 로그를 남기고 몇일에 한번씩 해당 파일들을 백업해서 옮기는 것이 운영서버에 성능 부하를 덜 발생시킬 것이라고 생각했다.
서버 환경
- AWS amazon linux2 EC2
우선 수동으로 python으로 작성한 backupLog 파일을 실행해본다.
sudo python /home/path/backupLog_to_s3.py
백업 파일은 직접 구현한, S3 API를 사용하여 파일을 저장하는 StorageS3 모듈을 사용한다.
# -*- coding: utf-8 -*-
from core.s3 import StorageS3
import os
def backup_logs_to_s3():
"""서버 로컬 log AWS S3에 백업
"""
logs_directory = "logs/"
# logs 폴더의 파일들을 순회
for file_name in os.listdir(logs_directory):
# 로그 파일 이름이 'service.log.날짜' 형식인지 확인
if file_name.startswith("service.log."):
file_path = os.path.join(logs_directory, file_name)
# 파일이 실제 파일인지 확인
if os.path.isfile(file_path):
# S3로 파일 업로드
with open(file_path, 'rb') as file:
s3 = StorageS3(media_root="logs/")
file_name += '.txt' #txt 확장자 추가
file_path = s3.upload(file, f"{file_name}")
파일이 정상적으로 잘 실행된다면, cron 파일 생성 및 작성한다.
#파일 편집하기
sudo vi /etc/crontab
cron 스케줄링 주기 설정에 맞게 작성한다.
sh 파일 실행하고 backup_log_output.log에 cron 실행 로그를 남기는 예시이다.
#매주 일요일 새벽 4시에 실행
0 4 * * 0 root sh /home/path/backup_log.sh >> /home/path/backup_log_output.log 2>&1
cron 예시
30 10,22 * * * /home/user/test.sh
- 매일 오전 10시 30분, 오후 10시 30분에 /home/user/test.sh 를 수행.
*/10 * * * * /home/user/test.sh
- 10분 마다 /home/user/test.sh 를 수행.
##0 8 * * 1-5 /home/user/test.sh
- 평일(월~금요일) 8:00 시에 /home/user/test.sh 를 수행.
마지막으로, cron 파일을 수정 후에 cron 서비스를 재시작 합니다.
sudo systemctl restart crond