はじめに
環境(職場)が変わる毎に書いている気がするログのローテート処理。
今回はメモしておくことにしました。
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の書き方の参考になれば幸いです。
以上でした!