【Shell】ログバックアップを考える & 簡易スクリプトの作成

 ■ はじめに

Apache や Tomcat 等でログが出力されるが、
そのまま放置したら大量なログが出てしまう可能性がある。

その一つの解決策として、定期的に圧縮してバックアップを取る
といった事を考えられるので、その方法を調べ、簡易的なものを作ってみる

 【1】解決案

# 他にもあるかもしれないが... 
 * 独自でログバックアップ用のスクリプトを組み、
   そのスクリプトを定期的に実行する

【2】考慮する事項

以下、考慮しなければならない事項である

 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 : cron に登録して、定期実行させる
方法2 : watchコマンドを使う
方法3 : 無限ループ & sleepコマンド を使う
 => 詳細は以下の関連記事を参照の事

定期実行するためのコマンド
https://dk521123.hatenablog.com/entry/2017/12/31/000300

 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

関連記事

watchコマンド
https://dk521123.hatenablog.com/entry/2024/03/24/232633
定期実行するためのコマンド
https://dk521123.hatenablog.com/entry/2017/12/31/000300