한 파일 안에 계속해서 누적되는 경우도 있겠지만 관리 효율성을 위해서 대부분 날짜 단위로 파일이 떨어지게 되고, 로그 삭제가 되지 않는다면 그 파일들이 계속해서 서버 특정 공간에 쌓이게 된다.
다들 경험해보아 알겠지만 로그파일이 많아봐야 어차피 최신 파일만 열어보게 되어 있고 대대적으로 로그 파일을 까보게 될 일이 없는 이상 일주일 이전의 파일을 열어보지는 않는다.
이번에도 내 영역이 아니라고 생각했던 내용의 포스팅을 올리게 된건 무튼 문제가 생겼기 때문이다.
서버에 로그가 계속 쌓이다보니 디스크 용량 문제가 발생한 관계로 로그파일 삭제 주기를 정하여 삭제 배치 프로그램을 짰다.
(사실 내가 왜 또 이 프로그램을 짜게 된지 모르겠지만 여튼 문제는 해결해야 하니까 하자.)
배치 프로그램 내용을 우선 기술하고 명령어에 대한 추가 설명을 정리하는 순서로 진행하려 한다.
#!/bin/bash
#######################
# batch for log files
# author : ojava
# since : 2019.09
#######################
# Variable
LOGDIR = /server/logs
BATCHDIR = /server/batch
NOW_DATE = $(date "+%Y/%m/%d %T")
cd ${LOGDIR}/instance/서비스명
# 배치프로그램 검수를 위해 echo를 통해 로그 찍어서 확인
{
echo " "
echo "${NOW_DATE} BATCH LOG"
echo "[DELETE FILE LIST]"
find . -name '*.log*' -mtime +30 -exec ls {} \;
# Delete files after 30 days of create
DELETE_CNT = $(find . -name '*.log*' -mtime +30 | wc -l)
find . -name '*.log*' -mtime +30 -exec rm -f {} \;
echo "[ACHIVE FILE LIST]"
find . -name '*.log' -mtime +7 -exec ls {} \;
# Archive files after 7 days of create
ARCHIVE_CNT = $(find . -name '*.log' -mtime +7 | wc -l)
find . -name '*.log' -mtime +7 -exec sh -c "gzip -f {}; rm -f {};" \;
} >> ${BATCHDIR}/batch_detail.log
echo "[${NOW_DATE}] DELETE COUNT : ${DELETE_CNT}, ARCHIVE COUNT : ${ARCHIVE_CNT}" >> ${BATCHDIR}/batch.log
# Variable
LOGDIR = /server/logs
BATCHDIR = /server/batch
NOW_DATE = $(date "+%Y/%m/%d %T")
#을 통해서 주석임을 명시하고, 하단에 변수들이 선언됨을 안내해준다.
선언해둔 변수를 사용할 때는 ${변수명} 형태로 사용하면 된다.
변수 중 NOW_DATE의 경우는, 다른 변수와 달리 $( ) 의 형태로 선언되어 있다.
쉘 스크립트에서 현재 시각을 날짜 표현식을 이용해서 표시할때는 $( ) 요런 형태로 사용한다.
3) 실제 로그 삭제처리 내용
# Delete files after 30 days of create
DELETE_CNT = $(find . -name '*.log*' -mtime +30 | wc -l)
find . -name '*.log*' -mtime +30 -exec rm -f {} \;
# Archive files after 7 days of create
ARCHIVE_CNT = $(find . -name '*.log' -mtime +7 | wc -l)
find . -name '*.log' -mtime +7 -exec sh -c "gzip -f {}; rm -f {};" \;
만들어진지 7일 이상된 파일은 용량 관계상 압축해서 보관하고 원본은 삭제하기로 했다.
2018/09/27 - [TIP/Linux] - [Linux] 최근 변경 파일 탐색
DELETE_CNT, ARCHIVE_CNT 수는 일자별 배치프로그램 결과를 누적할 때 사용하기 위해서 저장한 변수고, find 명령어를 통해 찾은 결과값의 line 수를 반환하여 변수에 저장한다.
실제로 파일 삭제를 위해서는 아래와 같은 처리를 진행한다.
find . -name '*.log*' -mtime +30 -exec rm -f {} \;
find . -name '*.log' -mtime +7 -exec sh -c "gzip -f {}; rm -f {};" \;
-exec 뒷 부분에 rm -f {} 를 쓰는 경우, 삭제를 강제로 진행한다는 옵션이고 {} 를 써주는 건 앞에서 받은 결과값의 목록을 변수로 받는다는 의미이다.
-exec 뒷 부분에 sh -c 를 쓰면 뒤이어 쓴 문자열로 묶어둔 명령어를 실행하라는 의미다.
gzip -f {} 부분은 앞의 find 명령어로 받은 결과물을 gzip 압축했다는 의미고, 그 뒤에 rm 명령어를 통해 삭제처리를 했다. 그럼 압축한 뒤에 원본 파일은 삭제되는 형태다.
구글링을 해도 sh 명령어에 대한 내용이 잘 나오질 않아서 아래의 내용을 참고했다.
https://linux.die.net/man/1/sh
그리고 명령어 모음들이 다 끝나고 나면 꼭 \; 를 써서 명령어가 끝난다는 의미를 써줘야 한다.
배치프로그램의 전체 내용을 그대로 실행시키면 실행 시 삭제/압축된 대상이 상세하게 떨어지는 파일이 하나 나오고, 배치프로그램이 실행될 때마다 로그 파일에 일자별 수행이력이 저장된다.
'Server > Linux' 카테고리의 다른 글
[Linux] crontab 설정 및 로그 확인 (2) | 2021.01.13 |
---|---|
[Linux] alias 설정하기 (0) | 2019.09.02 |
IP 확인 : ping, tracert, nslookup (0) | 2018.10.04 |
[Linux] 최근 변경 파일 탐색 (0) | 2018.09.27 |
Ubuntu에 Oracle JDK 설치하기 (0) | 2017.06.20 |