■ はじめに
Apache や Tomcat 等でログが出力されるが、 そのまま放置したら大量なログが出てしまう可能性がある。 その一つの解決策として、定期的に圧縮してバックアップを取る といった事を考えられるので、その方法を調べ、簡易的なものを作ってみる
■ 解決案
# 他にもあるかもしれないが... * 独自でログバックアップ用のスクリプトを組み、 そのスクリプトを定期的に実行する
■ 考慮する事項
以下、考慮しなければならない事項である
1)バックアップ出力先は?
* そのシステムのポリシーもあると思うので一概に言えないし、一般的にどこにおくか分からんが...
Debianの場合
* 「/var/backups」ってあったので、その配下でいいのでは? * 「/var/log」配下に「backups」ってディレクトリを作って...てのもあり?
【補足】
* var : システムログなどの動的に変化するファイル
http://www.atmarkit.co.jp/ait/articles/0109/07/news002_2.html
http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html
2)スクリプトを定期的に実行する方法は?
* スクリプトを組む前に「スクリプトを定期的に実行する」を考える
方法1-1 : cron に登録して、定期実行させる
* cron(クローン) とは、スクリプトを自動実行するためのデーモン * 登録方法は、「crontabコマンドを使う」「Webmin(ウェブミン)などのアプリを使う」 とありそうだが、ここでは扱わない
方法1-2 : 無限ループ & sleepコマンド を使う
=> バックアップ用のスクリプトに1ファイルとして組み込めるので、 簡易なツールとしては、まーいいのでは?
構文
while true do # 【実行する処理コマンド】 sleep 【周期(例 : 24h)】 done
方法1-3 : watchコマンドを使う
* watchコマンド : 定期的にコマンドを実行する => 簡易版として、個人的には方法2より、 「定期実行」「バックアップ」と分離できるこちらの方法の方がいいと思う。 => 監視にも使えるらしい...
構文
http://kazmax.zpp.jp/cmd/w/watch.1.html
http://blog.majide.com/2006/01/how-to-use-linux-watch-command/
# を参考に... watch -n 【周期(秒)】 【定期的に実行したいコマンド】
サンプル
# 「ls -l」を10秒後に実行し、オプション「-d」で変更されたらハイライトされる watch -d -n 10 ls -l
3)バックアップ用スクリプトについて
方法2-1 : rsyncコマンドを使用する
* rsyncコマンド : 高速なファイル同期を行うコマンド => 新旧ファイル間の差分をコピーするので、高速に処理でき、バックアップとしても使える => バックアップした後、元ファイルを削除するっていったときには、向かない?
http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html
https://users.miraclelinux.com/update/?q=node/172
方法2-2 : tar / zipで固める
=> まー分かりやすいので、簡易的なものであれば、十分かなっと。 => Linuxだけを考えれば、zipは環境によってZIPコマンドがインストールされていない可能性があるので tarで圧縮した方がいいかも。
■ サンプル
* Tomcatログを対象に、上記の「方法1-3」&「方法2-2」を採用して、 サンプルスクリプトを組んでみる
バックアップ用スクリプト : BackupTomcatLogs.sh
#!/bin/bash # Setting Value # 実行間隔 execution_interval=24h tomcat_home="/usr/tomcat" target_logs_dir="${tomcat_home}/logs" output_backup_dir="/var/backups/tomcat" echo "******************************" echo "* execution_interval: ${execution_interval}" echo "* tomcat_home : ${tomcat_home}" echo "* target_logs_dir : ${target_logs_dir}" echo "* output_backup_dir : ${output_backup_dir}" echo "******************************" # 出力先のディレクトリを作成しとく # -p : 指定したディレクトリをサブディレクトリごと作成する mkdir -p ${output_backup_dir} chmod 777 ${output_backup_dir} while true do # 必ず「`(バッククォート。@キー+Shiftキーで入力)」で囲む start_datetime=`date "+%Y%m%d_%H%M%S"` echo "Starting Backup Tomcat Log. ${start_datetime}" if [ -z "`ls ${target_logs_dir}`" ]; then # fileが存在しなかった場合 echo "No file for backup." else # fileが存在した場合 output_backup_zip="${output_backup_dir}/tomcatlog_${start_datetime}.zip" # ZIP圧縮(http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231001/ より抜粋) # -r : ファイルとディレクトリを再帰的に処理する # -q : 処理内容を表示しない # -j : ファイルのパスを記録せず,対象に含まれていてもディレクトリは格納しない echo "Creat ZIP file. ${output_backup_zip}" zip -rqj ${output_backup_zip} ${target_logs_dir} chmod 777 ${output_backup_zip} # 今日のログ以外削除 today=`date "+%Y-%m-%d"` echo "Cleanup except files of ${today}." ls -dF ${target_logs_dir}/* | grep -v -E '*${today}.log$|catalina.out' | xargs rm -rf fi end_datetime=`date "+%Y%m%d_%H%M%S"` echo "Done. ${end_datetime}" sleep ${execution_interval} done
参考文献
ディレクトリのファイルの有無をしらべる
http://kuchitama.hateblo.jp/entry/20111226/p1