• このエントリーをはてなブックマークに追加

【linux】ログの2段階バックアップ

  • このエントリーをはてなブックマークに追加

log
zaco muraです。

サーバ運用者であれば誰でも見るのがログです。
しかし大規模なシステムであればログの量も膨大であり、長期間運用すれば数ギガバイトのサイズになることも珍しくありません。
そんな時に必要なのがログのローテーションです。その中でも今回はログを2段階でローテーションするやり方を書いておきます。

前提:ログローテーションとは

サイズや日にち単位でログファイルを分けて管理することです。こうすることでログを小さな単位で管理でき、確認や加工が楽になります。
これを実現するためにはlogrotateを使います。centosであればyum、debianであればaptなどでインストール可能(なはず)です。
なお、logrotateはデーモンとして常駐するようなものではなく、cronにより実行されます。

やりたいこと

ログを2段階でバックアップしたいと考えました。つまり、短期的なログの管理と長期的な管理を分けたいということです。
具体的にはこんな感じでした。

1. 当日~1ヶ月程度のログをローテーション(番号で管理)
2. 1ヶ月~3年のログをストレージ装置にバックアップする

ということを行いたいと考えています。

ログの2段階バックアップ

それでは本題の2段階バックアップのやり方です。これはlogroteのfirstaction句を使うことでできます。
firstaction句は、logrotateの設定ファイル単位で1回だけスクリプトを実行するような場合に使われます。
(ちなみにprerotateは対象のログファイル単位で実行されます)

今回はこのように書きました。
(※言わずもがなですが、自己責任でお願いします)

logrotateの設定ファイル

# cat /etc/logrotate.d/backuptest
/var/log/test.log {
    missingok
    ifempty
    daily
    rotate 10
    create 0600 root root
    firstaction
        /usr/local/tools/log_archive.sh
    endscript
}

backup用のスクリプト

# cat /usr/local/tools/log_archive.sh

#!/bin/sh
#
# rotate回数を超えたファイルを、日付を付与しバックアップするスクリプト
################

### rotate回数をlogrotateの設定ファイルから取得
LOGROTATE_CONF="/etc/logrotate.d/backuptest"
ROTATE_NUM="`awk '$1~/^rotate$/{print $2}' ${LOGROTATE_CONF}`"

### 今回のローテーションでrotate回数を越えるファイルがある場合、バックアップ
if [ -e "/var/log/test.log.${ROTATE_NUM}" ];then
	### ファイルの最終更新日を取得(ファイル名に付与するため)
	LAST_UPDATE="`stat -c %y /var/log/test.log | awk '{print $1}'`"

	### バックアップ実行(/var/log/OLD/ にストレージ装置をマウントしている想定)
	cp -p /var/log/test.log.${ROTATE_NUM} /var/log/OLD/test.log.${LAST_UPDATE}
fi

これを実行するとこのようになっています。

### この環境では.10までローテーションする

# ls -l /var/log/test.log*
-rw------- 1 root root 0  9月 17 04:02 /var/log/test.log
-rw------- 1 root root 0  9月 16 13:10 /var/log/test.log.1
-rw------- 1 root root 3  9月 16 11:36 /var/log/test.log.10
-rw------- 1 root root 0  9月 16 11:39 /var/log/test.log.2
-rw------- 1 root root 5  9月 16 11:39 /var/log/test.log.3
-rw------- 1 root root 4  9月 16 11:39 /var/log/test.log.4
-rw------- 1 root root 3  9月 16 11:38 /var/log/test.log.5
-rw------- 1 root root 3  9月 16 11:38 /var/log/test.log.6
-rw------- 1 root root 3  9月 16 11:38 /var/log/test.log.7
-rw------- 1 root root 3  9月 16 11:38 /var/log/test.log.8
-rw------- 1 root root 3  9月 16 11:36 /var/log/test.log.9

### スクリプトが実行され、バックアップされたファイル

# ls -l /var/log/OLD/
合計 4
-rw------- 1 root root 3  9月 16 11:35 test.log.2015-09-16

まとめ

logrotateは意外と柔軟に運用できるんだなと思いました。
ちなみにこのやり方はこのあたりを参考にさせて頂きました。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link