logrotateやってみました
岸明日香さんです。ゴットタンという大人向けバラエティ番組で、
飲みっぷり選手権的なのをやっていて、それで、知りました。
関西弁いいすね
さて、今回は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