본문 바로가기
Server/Linux

[Linux] 로그 삭제 배치프로그램

by ojava 2019. 9. 23.
반응형
서버에 어플리케이션 서비스를 올리게 되면 서버 자체 로그나 서비스 이용 로그가 계속해서 누적된다.

한 파일 안에 계속해서 누적되는 경우도 있겠지만 관리 효율성을 위해서 대부분 날짜 단위로 파일이 떨어지게 되고, 로그 삭제가 되지 않는다면 그 파일들이 계속해서 서버 특정 공간에 쌓이게 된다.


다들 경험해보아 알겠지만 로그파일이 많아봐야 어차피 최신 파일만 열어보게 되어 있고 대대적으로 로그 파일을 까보게 될 일이 없는 이상 일주일 이전의 파일을 열어보지는 않는다.



이번에도 내 영역이 아니라고 생각했던 내용의 포스팅을 올리게 된건 무튼 문제가 생겼기 때문이다.
서버에 로그가 계속 쌓이다보니 디스크 용량 문제가 발생한 관계로 로그파일 삭제 주기를 정하여 삭제 배치 프로그램을 짰다.
(사실 내가 왜 또 이 프로그램을 짜게 된지 모르겠지만 여튼 문제는 해결해야 하니까 하자.)



배치 프로그램 내용을 우선 기술하고 명령어에 대한 추가 설명을 정리하는 순서로 진행하려 한다.

#!/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 ​
 
1) #!/bin/bash
문서 파일을 만들기 위해 vi 등을 통해 파일을 생성하게 되는데, 그런 파일들 중 이 파일이 실행가능한 shell이라는 걸 명시하기 위해서 맨 첫번째 줄에 해당 내용을 기술해준다.

 

2) 변수선언부

# 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 {};" \;

 

나는 로그 삭제 기준일을 30일로 잡았다. 만들어진지 30일이 넘은 파일은 삭제처리하고
만들어진지 7일 이상된 파일은 용량 관계상 압축해서 보관하고 원본은 삭제하기로 했다.
해당 일자별 로그파일 조회를 위한 find 명령어는 기존에 작성했던 아래의 포스팅에 잘 써놨다.
 

2018/09/27 - [TIP/Linux] - [Linux] 최근 변경 파일 탐색

 

[Linux] 최근 변경 파일 탐색

검증서버에 작업내용을 올리고 검수가 완료될때까지 이것 저것 또 다른 작업을 하다보면 실제로 어떤 파일을 운영에 릴리즈해야 하는지 헷갈릴 때가 온다. 요청 > 검수 > 반영의 완벽한 하모니가 이루어지면 좋겠..

ojava.tistory.com

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 {};" \;

find 명령어를 통해 대상 검색 -exec 실행하고자 하는 내용 \;

-exec 뒷 부분에 rm -f {} 를 쓰는 경우, 삭제를 강제로 진행한다는 옵션이고 {} 를 써주는 건 앞에서 받은 결과값의 목록을 변수로 받는다는 의미이다.

-exec 뒷 부분에 sh -c 를 쓰면 뒤이어 쓴 문자열로 묶어둔 명령어를 실행하라는 의미다.
gzip -f {} 부분은 앞의 find 명령어로 받은 결과물을 gzip 압축했다는 의미고, 그 뒤에 rm 명령어를 통해 삭제처리를 했다. 그럼 압축한 뒤에 원본 파일은 삭제되는 형태다.

 

구글링을 해도 sh 명령어에 대한 내용이 잘 나오질 않아서 아래의 내용을 참고했다.

https://linux.die.net/man/1/sh

 

sh(1): GNU Bourne-Again SHell - Linux man page

sh(1) - Linux man page Name bash - GNU Bourne-Again SHell Synopsis bash [options] [file] Copyright Bash is Copyright © 1989-2009 by the Free Software Foundation, Inc. Description Bash is an sh-compatible command language interpreter that executes commands

linux.die.net

 

그리고 명령어 모음들이 다 끝나고 나면 꼭 \; 를 써서 명령어가 끝난다는 의미를 써줘야 한다.

 

배치프로그램의 전체 내용을 그대로 실행시키면 실행 시 삭제/압축된 대상이 상세하게 떨어지는 파일이 하나 나오고, 배치프로그램이 실행될 때마다 로그 파일에 일자별 수행이력이 저장된다.

반응형

'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