-
간단한 Log Backup Shell 만들기Infra 2021. 5. 14. 19:30
보통 시스템을 운영하면 일자별로 로그파일이 생성되고, 일정기간이 지난 로그는 따로 백업을 하게 됩니다. (해당 디렉토리 용량부족 등의 이유로 진행)
리눅스 환경에서 로그파일 백업을 자동화 하기 위해 shell을 등록하고 자동화하는 작업을 진행했습니다.
매번 할때마다 익숙치 않아서 복습 겸 정리하게 됐습니다.LOG BACKUP SHELL 기능
- 특정월의 로그파일들을 .gz으로 압축한다.
- 로그파일의 포맷은 test_yyyymmdd.log 으로 되어있다.
- 파라미터로 해당월을 입력받지 않으면 M-1월 파일들을 백업한다.
- 백업할 대상이 없으면 처리하지 않는다.
- 압축한 파일을 백업 디렉토리로 옮긴다.
- 원본 로그파일들은 삭제한다.
위와 같은 기능을 생각하고 만들었습니다.
LOG BACKUP SHELL 필요요소
- source, target 디렉토리 경로 (로그파일이 있는 경로와 백업한 gz파일을 저장할 경로)
- 저번달을 구하는 date 명령어
- soruce file명, target file명
- 압축, 이동, 삭제 명령어
이와 같은 요소들을 구상했습니다. 이제 Shell을 작성해보겠습니다.
# .bash_profile echo "start backup log shell" #date명령으로 저번달을 구함 (yyyymm) last_month=`date +'%Y%m' -d '1 month ago'` #로그,백업경로 source_dir='/log/test' target_dir='/log/test/bak' #압축할 대상 파일명 결정 if [ "x" == "x"$1 ] then source_file='test_'$last_month'*.log' target_file='test_log_bak_'$last_month'.gz' else source_file='test_'$1'*.log' target_file='test_log_bak_'$1'.gz' fi #backup cd $source_dir #backup 대상이 존재할 경우에만 진행 if [ -f $source_file ] then tar czvf $target_file $source_file mv $target_file $target_dir rm -rf $source_file else echo "백업할 로그파일이 존재하지 않습니다." fi echo "finish"
하나하나 뜯어보겠습니다.
last_month
last_month=`date +'%Y%m' -d '1 month ago'` #또는 아래와 같이 사용해도 됨 last_month=$(date +'%Y%m' -d '1 month ago')
date옵션을 사용했습니다. date는 기본적으로 현재시간을 표시하는데 여기에 옵션을 추가하여 원하는 날짜를 구할 수 있습니다. 저는 현재시간 기준 한달전 시간을 구했습니다. 만약 2018-04-11 23:14 의 한달전이면 대략 2018-03-11 23:14 가 나올텐데 여기서 우리가 알고싶은건 년월 이므로
%Y%m
포맷을 부여해서 원하는 값을 추출했습니다.압축할 대상 파일명 결정
if [ "x" == "x"$1 ] then source_file='test_'$last_month'*.log' target_file='test_log_bak_'$last_month'.gz' else source_file='test_'$1'*.log' target_file='test_log_bak_'$1'.gz' fi
압축파일 파일명을 결정하는 부분의 경우 사용자가 특정월을 입력할 경우 처리할 수 있도록 하느라 조건을 걸었습니다.
"x"=="x"$1
조건의 의미를 보면 $1값이 안들어오면 양변의 값이 같아지므로사용자가 특정월을 입력하지 않은 경우
가 됩니다. 이런경우 shell에서 구한 $last_month를 자동으로 사용하게 됩니다.backup 대상이 존재할 경우에만 진행
if [ -f $source_file ] then tar czvf $target_file $source_file mv $target_file $target_dir rm -rf $source_file else echo "백업할 로그파일이 존재하지 않습니다." fi
if [ -f $source_file ]
조건을 준 이유는 백업할 대상이 없는데 shell을 실행하면 껍데기만 있는 gz 파일이 생성되어 기존에 만들어진 백업파일을 덮어써버립니다. 예를들어 2018년 03월의 로그파일들을 이미 백업해서test_log_bak_201803.gz
파일이 만들어졌는데 shell을 한번 더 돌리면 빈 껍데기인test_log_bak_201803.gz
파일이 만들어지고 덮어써집니다. 이렇게 되면백업해둔 로그가 날아가게 됩니다.
그래서 해당월의 로그파일들이 존재할 경우에만 백업을 진행하도록 옵션을 걸었습니다.
tar 압축옵션이 다양한데 일반적으로 압축할 때 사용하는 옵션들은 아래와 같습니다.
- c(cretate) - 새 파일 생성
- v(verbose) - 처리과정 출력
- z(gzip) - gz으로 압축
- f(file) - 파일명지정
만약 처리과정이 보고싶지 않다면 옵션에서 v를 뺀
tar czf $target_file $source_file
이런식의 명령을 실행하면 됩니다.'Infra' 카테고리의 다른 글
리눅스 서버 배포환경 구축하기 4 - Jenkins설치 및 git연동 (0) 2021.05.19 리눅스 서버 배포환경 구축하기 3 - 톰캣 설치 및 아파치 연동 (1) 2021.05.18 리눅스 서버 배포환경 구축하기 2 - 아파치 설치 (0) 2021.05.17 리눅스 서버 배포환경 구축하기 1 - CentOS7 설치 (0) 2021.05.16 리눅스 Shell2 - file merge, split (0) 2021.05.15 - 특정월의 로그파일들을 .gz으로 압축한다.