HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

ログファイルのローテート処理をbashで書いた

はじめに

環境(職場)が変わる毎に書いている気がするログのローテート処理。
今回はメモしておくことにしました。

logrotate が使えるのなら、自作よりもそのほうが良いと思います。

中身

#!/bin/bash

########################################
# ログファイルのローテート処理を行います
# 前提:
# - yyyymmddがファイル名の頭につくこと
# - gzipを使えること
# - 圧縮したファイルはold/に放り込む
########################################

# 名前の定義
LOG_DIR="/path/to/logs"
OLD_LOG_DIR=${LOG_DIR}/old

today=`date +%Y%m%d`
LOG_FILE_NAME=${LOG_DIR}/${today}.log

if [ ! -d ${OLD_LOG_DIR} ]; then
    mkdir ${OLD_LOG_DIR}
fi

# ログディレクトリ内を漁る
# 古い日付のファイルに対して、圧縮と移動を行う
fileList=($(ls ${LOG_DIR}))
for fileName in ${fileList[@]}; do
    if [ -f ${LOG_DIR}/${fileName} -a $((${today} - ${fileName:0:8})) -gt 0 ]; then
        gzip ${LOG_DIR}/${fileName}
        mv -f ${LOG_DIR}/${fileName}.gz ${OLD_LOG_DIR}/
        echo "gzipped and move the file: "${fileName}
    fi
done

# ログが何もなくともtailできるように空ファイル作成
if [ ! -f ${LOG_FILE_NAME} ]; then
    touch ${LOG_FILE_NAME}
fi

見慣れなさそうな処理の解説

fileList=($(ls ${LOG_DIR}))

bashの配列はカッコ()でくくられており、中身は半角スペース空きなので、
上記でとあるディレクトリ配下にあるファイル名の配列を作成できます。
$()でカッコ内のコマンドを実行できます。

${fileList[@]}

配列を展開することができます。

fruits=(apple orange banana)
echo ${fruits[@]}

# 出力:
# apple orange banana

こちらの記事でも書きました。
https://hrroct.hatenablog.com/entry/2017/02/10/112808

${fileName:0:8}

変数展開と呼ばれるもので、

${parameter:offset:length}

という並びです。
${fileName:0:8}なら、ファイル名を頭から8文字でカットして返してくれます。

(Markdown記法にひっかかって書けなかった)

$((${today} - ${fileName:0:8}))は算術式です。
$((...))で囲むことで、計算が可能になります。
(今日の日付 - 対象ファイルの日付)

終わりに

ログローテート処理を書かなくとも、bashの書き方の参考になれば幸いです。
以上でした!