블로그 이미지
Peter Note
Web & LLM FullStacker, Application Architecter, KnowHow Dispenser and Bike Rider

Publication

Category

Recent Post

2013. 2. 20. 17:36 Middleware, Cloud/Linux

로그 백업을 위하여 crontab에 등록할 Bash Shell를 작업하려 한다. 익혀간 과정을 적어보자 


1) Backup 가정

  - 3일전 로그를 압축한다.

  - 여러개의 로그파일이 다양한 위치에 존재한다

  - 압축된 로그파일은 년/월 별도 디렉토리로 이동하여 관리한다

  - 작은 업무 시스템별로 로그의 위치가 틀리다 (단, 작은 업무 시스템안에 디렉토리는 고정임)


2) 3일전 로그찾기 

  - 몇일전 날짜를 찾는 문법 (참조)

####################################################

# 1) output is 3 days ago 

# backup directory name : backup_YYYY-MM in log files

# 3일전 파일을 찾는다 

YYYYMMDD=`date +%Y%m%d --date '3 days ago'`

DATE="${YYYYMMDD:0:4}-${YYYYMMDD:4:2}-${YYYYMMDD:6:2}"

BK_DIR="backup_${YYYYMMDD:0:4}-${YYYYMMDD:4:2}"

GZIP_CNT="0"


echo ""

echo "===============================[Backup Start]============================="

echo "<< Start Time: "`date '+%F  %r'`" >>"

echo "-- Backup File Date : $DATE, Backup Dir : $BK_DIR"


3) 여러개의 로그파일이 다양한 위치에 존재함

  - 지정한 디렉토리에 파일이 있으면 gzip으로 압축한다

####################################################

# 2) run gzip for log files

# ${1} : directory full path

# ${2} : file name

function mkdir_function()

{

  if [ ! -d ${1} ]; then

    echo "  make dir : ${1}"

    mkdir ${1}

  fi

}


# backup_YYYY-MM 디렉토리가 없으면 만들고 .gz  압축파일을 월별로 관리한다 

function mv_file_function()

{

  mkdir_function "${1}/$BK_DIR"


  echo "  move : ${1}/${2}.gz to ${1}/$BK_DIR"

  mv ${1}/${2}.gz ${1}/$BK_DIR/

}


# ${1} : directory full path

# ${2} : file name

# 지정된 파일만 압축 

function gzip_function() 

{

  if [ -e ${1}/${2} ]; then

    cd "${1}"    

    echo "  gzip : ${1}/${2}"


    gzip ${1}/${2}


    mv_file_function "${1}" "${2}"  


    GZIP_CNT=`expr $GZIP_CNT + 1` 

  fi

}


# for time loop gzip

# 3일 이전의 모든 파일들 

function gzip_loop_function()

{

  cd "${1}"

  for file in `find -type f -mtime +3`; do

     local FNAME="${file:2}"

     local EXT="${FNAME##*.}"

     if [ "$EXT" != "" ] && [ "$EXT" != "gz" ] && [ "$EXT" != "sh" ]; then

        gzip_function "${1}" "${FNAME}"

     fi

  done

}


4) 업무 단위 시스템별로 로그의 위치 지정 : 로그 지정하여 압축 수행함 

  echo "-- [START] ${JDOMAIN} backup : TX.xml & Error.xml log"

  gzip_function "/tmp/logs" "Transactions.log.$DATE"

  gzip_function "/tmp/logs" "Error.log.$DATE"


  # gc old log

  echo "-- [START] ${JDOMAIN} backup : old gclog log"

  gzip_loop_function "/tmp/logs/$JDOMAIN/old/gclog"

 

  # nohup old log

  echo "-- [START] ${JDOMAIN} backup : old nohup log"

  gzip_loop_function "/tmp/logs/$JDOMAIN/old/nohup"


5) 전체 Shell Script

#!/bin/bash
####################################################
#
# This is backup shell for the WAS Server Logs
# author : yun young sik, yuwon system
# blog : http://mobicon.tistory.com
# date : 2013.02.20
#
####################################################
####################################################
# 1) output is 3 days ago
# backup directory name : backup_YYYY-MM in log files
YYYYMMDD=`date +%Y%m%d --date '3 days ago'`
DATE="${YYYYMMDD:0:4}-${YYYYMMDD:4:2}-${YYYYMMDD:6:2}"
BK_DIR="backup_${YYYYMMDD:0:4}-${YYYYMMDD:4:2}"
GZIP_CNT="0"
echo ""
echo "===============================[Backup Start]============================="
echo "<< Start Time: "`date '+%F %r'`" >>"
echo "-- Backup File Date : $DATE, Backup Dir : $BK_DIR"
####################################################
# 2) run gzip for log files
# ${1} : directory full path
# ${2} : file name
function mkdir_function()
{
if [ ! -d ${1} ]; then
echo " make dir : ${1}"
mkdir ${1}
fi
}
function mv_file_function()
{
mkdir_function "${1}/$BK_DIR"
echo " move : ${1}/${2}.gz to ${1}/$BK_DIR"
mv ${1}/${2}.gz ${1}/$BK_DIR/
}
# ${1} : directory full path
# ${2} : file name
function gzip_function()
{
if [ -e ${1}/${2} ]; then
cd "${1}"
echo " gzip : ${1}/${2}"
gzip ${1}/${2}
mv_file_function "${1}" "${2}"
GZIP_CNT=`expr $GZIP_CNT + 1`
fi
}
# for time loop gzip
function gzip_loop_function()
{
cd "${1}"
for file in `find -type f -mtime +3`; do
local FNAME="${file:2}"
local EXT="${FNAME##*.}"
if [ "$EXT" != "" ] && [ "$EXT" != "gz" ] && [ "$EXT" != "sh" ]; then
gzip_function "${1}" "${FNAME}"
fi
done
}
####################################################
# 3) get system name
# 호스트명칭에 따라서 백업파일의 위치가 틀리다.
HNAME="$(hostname)"
JDOMAIN=""
# prefix p=real, t=test
if [ $HNAME == "hostname2" ] || [ $HNAME == "hostname2" ]; then
JDOMAIN="xxxxDomain"
elif [ $HNAME == "hostname3" ]; then
JDOMAIN="yyyyDomain"
# Unknown Domain (error)
else
JDOMAIN="unknown"
fi
echo "-- HostName : $HNAME, JbossDomainName : $JDOMAIN"
echo ""
############################################################
# 4) Gzip files
# These systems have the same log policy.
# xxxxDomain
if [ $JDOMAIN != "unknown" ] && [ $JDOMAIN != "hostname2" ] && [ $JDOMAIN != "hostname2" ]; then
# Gzip about /tmp/logs/Transaction.log.[before 3days], Error.log.[before 3days]
# ex) /tmp/logs/Transaction.log.2013-01-05, /tmp/logs/Error.log.2013-01-05
echo "-- [START] ${JDOMAIN} backup : TX.xml & Error.xml log"
gzip_function "/tmp/logs" "Transaction.log.$DATE"
gzip_function "/tmp/logs" "Error.log.$DATE"
# gc old log
echo "-- [START] ${JDOMAIN} backup : old gclog log"
gzip_loop_function "/tmp/logs/$JDOMAIN/old/gclog"
# nohup old log
echo "-- [START] ${JDOMAIN} backup : old nohup log"
gzip_loop_function "/tmp/logs/$JDOMAIN/old/nohup"
# yyyyDomain
# The YYYY system has the different log policy from others
elif [ $JDOMAIN == "hostname3" ]; then
echo "-- [START] yyyyDomain backup : Transaction.log & Error.log files"
for ix in 1 2 3 4; do
gzip_function "/tmp/logs" "${JDOMAIN}${ix}_Transaction.log.$DATE"
gzip_function "/tmp/logs" "${JDOMAIN}${ix}_Error.log.$DATE"
done
fi
# Message print out
# echo success or fail
echo ""
if [ $JDOMAIN != "unknown" ]; then
if [ $GZIP_CNT -gt 0 ]; then
echo "-- [SUCCESS] Backup log [$GZIP_CNT] files!"
else
echo "-- [SUCCESS] There is no backup log files."
fi
else
echo "-- [FAIL] Unknown [$HNAME] hostname, check hostname!"
fi
echo "================================[Backup End]=============================="
echo ""


<참조>

  - 백업받을 디렉토리를 만들어야 하는 경우 : 하기 내용은 function을 이용한 참조 내역임 (다른 유사 참조)

  - Bash Shell 문법을 익혀보자 (참조)

  - Bash Shell 문법 : 옵션 잘 설명됨 (참조)

posted by Peter Note