シェルスクリプトを作成する

ログ受信サーバーに保存されているログファイルをWasabiに保存するためのシェルスクリプトを作成します。
※Wasabiに保存せずログ受信サーバーのローカルディスクに保存するパターンも記載します。

/usr/local/bin/fralogbk.shを作成する(Wasabiに保存するパターン)

  1. 以下のコマンドを実行し、シェルスクリプトを作成します。

    #!/bin/bash
    ###################################################################################
    # 更新日 : 2022/03/10
    # 版     : 0.1
    # 使用法 : /usr/local/bin/fralogbk.sh
    ###################################################################################
    
    ### 変数定義 ######################################################################
    PATH=${PATH}:/usr/local/bin
    ENDPOINT_URL="https://ap-northeast-1-ntt.wasabisys.com"
    BUCKET_NAME="s3://sdpf-fralog-bucket/"
    ERROR_LOG="/var/log/FRA/fralogbk/fralogbk.log"
    LOG_DIR="/var/log/FRA"
    BK_DIR="/var/log/FRA/backup"
    UP_DIR="/var/log/FRA/upload"
    DAY=`date +%Y%m%d`
    FRASV1=FRA0系のホスト名
    FRASV2=FRA1系のホスト名
    
    declare -a file_list=()
    
    ### エラーログ出力関数 ############################################################
    # 使用法 : ERROR_LOG_OUTPUT [エラーメッセージ] [エラーコード]
    ERROR_LOG_OUTPUT()
    {
      echo "`date +%Y/%m/%d-%H:%M:%S` $1 (code: $2)" >> ${ERROR_LOG}
    }
    
    ### ディレクトリー存在確認および作成 ##############################################
    if [ ! -d ${LOG_DIR} ]; then
      echo "td-agentのログファイル保存先が見つかりません。" 1>&2
      exit 1
    fi
    
    ### 実行ユーザー確認 ##############################################################
    USER_ID=`id -u`
    if [ ${USER_ID}  -ne 0 ]; then
      ERROR_LOG_OUTPUT "rootユーザーで実行する必要があります。" "1"
      exit 1
    fi
    
    ### Wasabi疎通確認 ################################################################
    aws s3 ls ${BUCKET_URL}  --endpoint-url=${ENDPOINT_URL} > /dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "Wasabiとの疎通確認が失敗したため、処理を終了します。" "${err_cd}"
      exit 1
    fi
    
    ############
    # MAIN
    ############
    
    ### ログファイルの存在確認 ########################################################
    FILE_CNT=`find ${LOG_DIR} -maxdepth 1 -type f -name "FRA*.log" | grep [0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9].log | grep -v ${DAY} | wc -l`
    if [ ${FILE_CNT}  -eq 0 ]; then
      echo "バックアップ対象のファイルが存在しないため、処理を終了します。"
      exit 0
    fi
    
    ### ログファイルをディレクトリに移動 ##############################################
    file_list=(`ls ${LOG_DIR} | grep [0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9].log | grep -v ${DAY} | gawk -F/ '{print $NF'}`)
    for i in "${file_list[@]}"                                                   # i=FRA.HOSTNAME.FACILITY.YYYYMMDD.log
    do
            DIR_NAME=`echo $i | cut -d. -f2,4`                                   # HOSTNAME.YYYYMMDD
            if [ ! -d ${BK_DIR}/${DIR_NAME} ];then
                    mkdir -p ${BK_DIR}/${DIR_NAME}
            fi
    
            cd ${LOG_DIR}
            mv -f $i ${BK_DIR}/${DIR_NAME}
    done
    
    ### ログファイルをZIPファイル化 ###################################################
    for j in `ls ${BK_DIR}`
    do
      W_DIR_NAME=`echo $j | cut -d. -f2 | cut -c 1-6`                           # YYYYMM
    
            if [ ! -d ${UP_DIR}/${W_DIR_NAME} ];then
                    mkdir -p ${UP_DIR}/${W_DIR_NAME}
            fi
    
      cd ${BK_DIR}/${j}
      zip ${UP_DIR}/${W_DIR_NAME}/${j}.zip * >/dev/null 2>>${ERROR_LOG}
      err_cd=$?
      if [ ${err_cd} -ne 0 ]; then
        ERROR_LOG_OUTPUT "ログファイルのZIP化に失敗しました。" "${err_cd}"
        exit 1
      fi
    done
    
    ### WasabiへFRAのログファイルを送信 ###############################################
    aws s3 sync ${UP_DIR} ${BUCKET_NAME} --endpoint-url=${ENDPOINT_URL} --exact-timestamps >/dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "Wasabiへのログファイル送信に失敗したため、処理を終了します。" "${err_cd}"
      exit 1
    fi
    
    ### 送信が完了したログファイルの削除 ##############################################
    cd ${UP_DIR}
    rm -rf * >/dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "${UPLOAD_LOG_DIR} 内のファイル削除に失敗しました。" "${err_cd}"
      exit 1
    fi
    
    cd ${BK_DIR}
    rm -rf * >/dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "${UPLOAD_LOG_DIR} 内のファイル削除に失敗しました。" "${err_cd}"
      exit 1
    fi
    
    
    cd ${LOG_DIR}
    rm -f `find ${LOG_DIR} -maxdepth 1 -type f -name "FRA*.log" | grep [0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9].log | grep -v ${DAY}` >/dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "${LOG_DIR} 内のファイル削除に失敗しました。" "${err_cd}"
      exit 1
    fi
    
    ###################################################################################
    
    echo "`date +%Y/%m/%d-%H:%M:%S` ログファイルの転送が正常に終了しました。" >> ${ERROR_LOG}
    exit 0
    

/usr/local/bin/fralogbk.shを作成する(ログ受信サーバーのローカルディスクに保存するパターン)

  1. 以下のコマンドを実行し、シェルスクリプトを作成します。

    #!/bin/bash
    ###################################################################################
    # 更新日 : 2022/03/10
    # 版     : 0.1
    # 使用法 : /usr/local/bin/fralogbk.sh
    ###################################################################################
    
    ### 変数定義 ######################################################################
    PATH=${PATH}:/usr/local/bin
    ENDPOINT_URL="https://ap-northeast-1-ntt.wasabisys.com"
    BUCKET_NAME="s3://sdpf-fralog-bucket/"
    ERROR_LOG="/var/log/FRA/fralogbk/fralogbk.log"
    LOG_DIR="/var/log/FRA"
    BK_DIR="/var/log/FRA/backup"
    UP_DIR="/var/log/FRA/upload"
    DAY=`date +%Y%m%d`
    FRASV1=FRA0系のホスト名
    FRASV2=FRA1系のホスト名
    
    declare -a file_list=()
    
    ### エラーログ出力関数 ############################################################
    # 使用法 : ERROR_LOG_OUTPUT [エラーメッセージ] [エラーコード]
    ERROR_LOG_OUTPUT()
    {
      echo "`date +%Y/%m/%d-%H:%M:%S` $1 (code: $2)" >> ${ERROR_LOG}
    }
    
    ### ディレクトリー存在確認および作成 ##############################################
    if [ ! -d ${LOG_DIR} ]; then
      echo "td-agentのログファイル保存先が見つかりません。" 1>&2
      exit 1
    fi
    
    ### 実行ユーザー確認 ##############################################################
    USER_ID=`id -u`
    if [ ${USER_ID}  -ne 0 ]; then
      ERROR_LOG_OUTPUT "rootユーザーで実行する必要があります。" "1"
      exit 1
    fi
    
    ############
    # MAIN
    ############
    
    ### ログファイルの存在確認 ########################################################
    FILE_CNT=`find ${LOG_DIR} -maxdepth 1 -type f -name "FRA*.log" | grep [0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9].log | grep -v ${DAY} | wc -l`
    if [ ${FILE_CNT}  -eq 0 ]; then
      echo "バックアップ対象のファイルが存在しないため、処理を終了します。"
      exit 0
    fi
    
    ### ログファイルをディレクトリに移動 ##############################################
    file_list=(`ls ${LOG_DIR} | grep [0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9].log | grep -v ${DAY} | gawk -F/ '{print $NF'}`)
    for i in "${file_list[@]}"                                                   # i=FRA.HOSTNAME.FACILITY.YYYYMMDD.log
    do
            DIR_NAME=`echo $i | cut -d. -f2,4`                                   # HOSTNAME.YYYYMMDD
            if [ ! -d ${BK_DIR}/${DIR_NAME} ];then
                    mkdir -p ${BK_DIR}/${DIR_NAME}
            fi
    
            cd ${LOG_DIR}
            mv -f $i ${BK_DIR}/${DIR_NAME}
    done
    
    ### ログファイルをZIPファイル化 ###################################################
    for j in `ls ${BK_DIR}`
    do
      W_DIR_NAME=`echo $j | cut -d. -f2 | cut -c 1-6`                           # YYYYMM
    
            if [ ! -d ${UP_DIR}/${W_DIR_NAME} ];then
                    mkdir -p ${UP_DIR}/${W_DIR_NAME}
            fi
    
      cd ${BK_DIR}/${j}
      zip ${UP_DIR}/${W_DIR_NAME}/${j}.zip * >/dev/null 2>>${ERROR_LOG}
      err_cd=$?
      if [ ${err_cd} -ne 0 ]; then
        ERROR_LOG_OUTPUT "ログファイルのZIP化に失敗しました。" "${err_cd}"
        exit 1
      fi
    done
    
    ### 送信が完了したログファイルの削除 ##############################################
    cd ${BK_DIR}
    rm -rf * >/dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "${UPLOAD_LOG_DIR} 内のファイル削除に失敗しました。" "${err_cd}"
      exit 1
    fi
    
    
    cd ${LOG_DIR}
    rm -f `find ${LOG_DIR} -maxdepth 1 -type f -name "FRA*.log" | grep [0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9].log | grep -v ${DAY}` >/dev/null 2>>${ERROR_LOG}
    err_cd=$?
    if [ ${err_cd} -ne 0 ]; then
      ERROR_LOG_OUTPUT "${LOG_DIR} 内のファイル削除に失敗しました。" "${err_cd}"
      exit 1
    fi
    
    ###################################################################################
    
    echo "`date +%Y/%m/%d-%H:%M:%S` ログファイルの圧縮処理が正常に終了しました。" >> ${ERROR_LOG}
    exit 0