メニュー 閉じる

logrotateでdateextとdelaycompressを手動で実現する方法

logrotateでは定期的にログをローテーションしてくれます。
ローテーションのオプションにもいくつかあって、今回は以下の2つについて取り上げます。

  • dateext:ファイル名末尾に日付をつける
  • delaycompress:1つ前のファイル以外は圧縮する

dateextとdelaycompressを手動で実行するスクリプト

通常はこれらのオプションをつけるだけで良いのですが、あえてこれを手動で実装する場合があります。
その書き方は次のようにします。

なお、例はCentOSにおけるapacheのログファイルをローテーションするスクリプト、/etc/logrotate.d/httpdの場合です。
主な部分だけ記載しているのでご注意。

/etc/httpd/logs/*log {
	daily    # 日付でファイルを作るのでdailyにします
	nocompress    # 圧縮は手動でするため無効にします。

	postrotate
	/sbin/service httpd reload > /dev/null 2>/dev/null || true

	EXT1=`date +%Y%m%d`    # 今日の日付
	EXT2=`date +%Y%m%d -d '1 days ago'`    # 昨日の日付

	for f in $1; do
		# ローテーションされたaccess_log.1のようなファイルを
		# access_log-20120123のようなファイル名にします
		if [ -e $f.1 ]; then
			mv $f.1 $f-$EXT1;
		fi

		# 前日のログaccess_log.20120122のようなファイルを
		# 圧縮してaccess_log-20120122.gzのようにします。
		if [ -e $f-$EXT2 ]; then
			gzip $f-$EXT2;
		fi
	done
	endscript
}

注意点

  • /etc/logrotate.confは標準のままを想定。
    • 特に、このファイルにdateextなどが書いてあるとダメです。
  • おそらくrotateオプション(ローテーション回数指定)は使えません。
    • 手動で実装しましょう。
    • rm -f `find $f-????????.gz -daystart -mtime +365` とかをpostrotateに書くことで何とかします(未確認)。

手動で実行するメリット

通常これらは、標準のオプション(つまり、dateextdelaycompress)を使うことで対処可能です。
ところが、ログローテーションの時刻はcron.dailyの実行時刻(/etc/crontab)に依存し、CentOSではデフォルトで毎日04:02に実行されます。
もしcron.dailyの実行時刻を00:02などに設定した場合、ログのファイル名に反して大半が前日のログ(前日00:02から当日00:02頃)で埋もれてしまうことになります。
非常に残念な感じですね。

これは非常に些細なことですが、気になる人には気になるようで、それならファイル名を前日の日付にすれば良いじゃないか、となる訳です。
# もちろん、cron.dailyの実行時刻を23:50頃にする事でも、似たような解決になることはなりますが。
そういった人に、この方法は助けをくれます。

実現方法

前日の日付でローテーションするとなれば、それをどう実現するか。
はい、上記の方法を用います。
但し上記の方法は単にdateextdelaycompressを実現しただけ。
これを前日の日付にする場合は、上記のコードのEXT1, EXT2の行を次のように修正します。

EXT1=`date +%Y%m%d -d '1 days ago'`    # 昨日の日付
EXT2=`date +%Y%m%d -d '2 days ago'`    # 一昨日の日付

こうすれば、前日の日付でローテーションされます。
個人的にはlogrotateで前日の日付でローテーションするオプションがあったら良いのになぁと思うところ。

コメントを残す