Profile picture

[Shell Script] 리눅스 로그 관리 스크립트

JaehyoJJAng2024년 03월 20일

▶︎ 개요

리눅스 서버를 운영하다보면 실행중인 애플리케이션들의 로그 또는 시스템 로그가 점차 쌓이게 된다.

한정된 용량 속에서 시스템 운영을 해야 하는데 로그는 시스템이 시작된 시점부터 종료될 때까지 계속해서 쌓이므로 이것을 정리할 무언가가 필요하다.

수 많은 로그 파일들을 관리자가 하나하나 삭제할 수는 없으므로,

오픈 소스인 로그 관리 프로젝트를 서버에 도입하거나

직접 스크립트를 작성하여 로그 파일들을 백업/삭제 해야하는 과정이 필요하다.

그래서 이번 포스팅에서는 오래된 로그 파일들을 보관 주기에 따라 보관하며(보관 시 용량 효율성을 위해 압축하여 로그 파일들을 보관),

정해진 일정량 만큼의 데이터를 지속적으로 유지하여 관리하는 스크립트를 작성해보도록 하겠다.


▶︎ 작업 순서

여기서 보관주기(crontab)와 유지 관리를 위해 셸 스크립트를 사용할 것이다.

crontab의 경우 아래 예제를 이용하여 적용할 예정이다.

셸 스크립트가 실행되며 남기는 로그들을 기록하는 것과, 그렇지 않은 것 두 가지 스타일 중 원하고자 하는 내용을 선택하면 된다.

# 매월 시작일 00:00분에 /scripts/log_backup.sh 스크립트를 실행
# 실행되며 생기는 로그는 저장하지 않음.
00 00 1 * * /scripts/log_backup.sh 1>/dev/null 2>&1

🤖 Tip

Log의 중요도에 따라 저장하는 내용이 다르다.

web 실행 로그나, 간단한 서비스 실행 로그와 같은 경우에는 과감히 지우며, 지우면서 생기는 로그는 저장하지 않는다.


▶︎ 스크립트 작성

🔸 매달 1일에 지난 달 데이터(로그)를 백업하며, 90일 간의 데이터를 유지한다. 4개월 이상 지난 Dir은 삭제.

#!/usr/bin/bash

#### 매달 1일에 지난 달 데이터 백업
currentDate="$(date '+%Y%m%d')"

# 지난 달
BACKUP_MONTH="$(date '+%Y_%m' -d '-1month')"
RM_MONTH="$(date '+%Y_%m' -d '-4month')"

# Nginx 로그 디렉토리 지정
targetPath="/var/log/nginx"

echo "########################################################################"
echo "## 1. $currentDate 로그 백업 시작"
echo "########################################################################"
echo

# 로그 디렉토리 이동
cd $targetPath
if [[ ! -d $BACKUP_MONTH ]]; then
    mkdir -p "$BACKUP_MONTH"
    chmod 755 "$BACKUP_MONTH"
fi

echo "########################################################################"
echo "## 2. 파일 압축"
echo "########################################################################"
find "$targetPath" -type f -name "*.log" -exec gzip {} \; 2>/dev/null
find "$targetPath" -maxdepth 1 -type f -name "*.gz" -exec mv -f {} "$BACKUP_MONTH" \;
echo

echo "########################################################################"
echo "## 3. 파일 삭제"
echo "########################################################################"
# 생성일로부터, 30일이 지난 파일 삭제
find "$targetPath" -type f -mtime +30 -exec rm {} \;
echo

echo "########################################################################"
echo "## 4. 폴더 삭제"
echo "########################################################################"
# 60일 이상 지난 오래된 폴더 삭제
find "$targetPath/$RM_MONTH" -exec rmdir {} \; 2>/dev/null
echo

Loading script...