Help us understand the problem. What is going on with this article?

クラスタ構成下で共有ディレクトリ上のログファイルをローテートする

More than 3 years have passed since last update.

はじめに

クラスタ構成下の複数台のLinuxサーバにて、
共有ディレクトリ上のログファイルをローテートする方法について。

背景

とある一日に複数回cronで実行するシェルがあり、
共有ディレクトリ上に実行結果のログを出力していたのですが、
こいつが稼働後数年経っているにも関わらず、ローテートされないままえらいことになっていました。

確かに1回1回のログの量は大したことがないのですが、
毎日複数回実行されるため、それが365日×数年分ともなれば、まさに塵も積もれば何とやら。

本来であればログのローテートなんかは、
/etc/logrotate.d/の中に設定ファイルを書いてlogrotateにやってもらうのが一番手っ取り早いのですが、
何せサーバが複数台のクラスタ構成になっているため断念。

シェル自体の修正も検討したのですが、
何せ動けばいいや的な思想で書かれたアレなクオリティだったため、
下手に修正しちゃうと火傷しかねないということもあり断念。

幸いにしてクラスタ構成下でアクティブなサーバを判定する方法はあったので、
手動でローテートするシェルをこさえた上で、全部のサーバのcronに仕込んで、
アクティブなサーバ上でのみローテートを実行するというやり方に落ち着き・・・・・・そうです。
(この記事を書いてる時点ではまだ100%決まってなかったりするのですが)

ローテートシェルの書き方

ローテートシェルの書き方については @Kuchitama さんの 自前でログローテートする という記事を参考にさせていただきました。ありがとうございます。

#!/bin/bash

# 対象ディレクトリ
LOGDIR="/xxx/log"

# 対象ログファイル
FILES="xxx.log yyy.log"

# ログ保存期間
ROTATE=14

DATE=`date +%Y%m%d`

for file in ${FILES}
do

    # 既に当日のローテートファイルが作成されている場合は処理を行わない
    if [ ! -e ${LOGDIR}/${file}.${DATE}.gz ]; then

        /bin/cp -p ${LOGDIR}/${file} ${LOGDIR}/${file}.${DATE}
        /usr/bin/gzip ${LOGDIR}/${file}.${DATE}

        # 対象ファイルを空にする
        if [ $? = 0 ];then
            /bin/cp /dev/null ${LOGDIR}/${file}
        fi

        # 指定した期間以前のファイルを削除する
        /usr/bin/find ${LOGDIR}/${file}.* -mtime +${ROTATE} -exec /bin/rm {} \;

    fi

done

基本的には参考にさせていただいた記事内のシェルを元に書いていますが、
アクティブサーバの切り替わり等や切り替わりに伴う手動でのシェル実行などを考慮して、
既に同じ日付のローテートファイルが作成されている場合には、
ローテート処理を実行しないようにしています。

9/20追記
この書き方だとroot以外のユーザで実行した場合にファイル・ディレクトリの権限の影響をモロに受けるので、
必要に応じてcpコマンドの前にsudoを付けるなど気を付けてください。

cron側の設定

* * * * * アクティブ判定シェル.sh > /dev/null 2>&1 && ローテートシェル.sh > /dev/null 2>&1

&&は「左側の式の終了ステータスが0だった場合に右側の式を実行する」なので、
アクティブサーバ判定用のシェルでアクティブなら終了ステータス0を渡すように書けば、
上記のようなcronの書き方でいけます。
うっかり&1個で書いちゃうとただの並列処理になってしまうので要注意。

環境によって判定するシェルの書き方なんかは変わってくると思うので省略しますが、
例えばアクティブなサーバのみネットワークに接続されているウォームスタンバイな環境なら、
ping飛ばしてその戻り値で判断するとか色々やり方はあるかと思います。

おわりに

一つ一つのログは小さくとも、
稼働後は時間の経過とともにどんどんディスク容量を食っていくので、
システム構築時に稼働後のことも考慮してローテートなどを組み込むかどうか検討しましょうというお話。
ただこちらが稼働3年で見積もって構築したシステムを平気で10年以上稼働させるユーザなんかザラにいるからなぁ

real_yaruo
基本SE・プログラマー、ごく稀にサーバーエンジニア、CS、PM、技術営業もやる何でも屋。IT業界の片隅で今日も元気に生きています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした