logrotateやってみました

岸明日香さんです。ゴットタンという大人向けバラエティ番組で、
飲みっぷり選手権的なのをやっていて、それで、知りました。

関西弁いいすね

f:id:linesnova:20140418162556j:plain

さて、今回はlogのrotateについて記載します。

ポイントは、rotateするタイミングで、プロセスを奪わないこと、できるだけ、タイムラグなく
参照元のログファイルを圧縮できるか、この2点です。


そしてこの2点は以下のコマンドが最適に思えたのでそれで実装してます。

cp /dev/null 参照元ログファイル名

mvせずに、コピーし、元ファイルを空っぽにしてあげるってのが上の原理です。
このコマンドでは瞬時に空にできるらしくログのロストなく、実装可能です(多分)

参考までに作成したサンプルを記載しておきます。
実行自体はjenkinsの定期実行で行っています。

やっていること

  • バックアップをとる rotate.sh
  • バックアップファイルを圧縮する compress.sh
  • バックアップファイルの古いものを削除する rmlog.sh

rotate.sh

#!/bin/bash

FROM_DIR="/var/log/"
TO_DIR="/var/log/hoge_bak/"


# 日付の取得
DATE=$(date +%Y-%m-%d)

#バックアップ保存先の存在確認
if [ ! -d ${TO_DIR} ]
then
  mkdir ${TO_DIR}
fi 

LOG_REG=`find  "/var/log/" -name "hoge*.log" -maxdepth 1 2>/dev/null`
for f in $LOG_REG
do
EXC_F_DIR=${f##*/} 
FILE_NAME=${EXC_F_DIR%.*}
echo ${FILE_NAME}
#日ごとにbackupファイルを作成、存在していた場合、ナンバリングする
cp --backup=numbered ${f} ${TO_DIR}${FILE_NAME}${DATE}.log; 
cp /dev/null ${f}
done

compress.sh

#!/bin/bash

TO_DIR="/var/log/hoge_bak/"

#バックアップ保存先の存在確認
if [ ! -d ${TO_DIR} ]
then
  mkdir ${TO_DIR}
fi
#一日以上前のbackupログを圧縮する
find  "${TO_DIR}" -maxdepth 1  -mtime +0 -iregex ".*\.log$\|.*\.log.+~$" | xargs gzip 2>/dev/null

rmlog.sh

#!/bin/bash

TO_DIR="/var/log/hoge_bak/"

#バックアップ保存先の存在確認
if [ -d ${TO_DIR} ]
then
  #一年以上前の圧縮ファイルを削除する
  find  "${TO_DIR}" -mtime +365  -iregex ".*\.gz$" -maxdepth 1 -exec rm -f {} \; > /dev/null 2>&1
fi