logrotateでログファイルがローテーションされない事への対処 で書きましたが、logrotateは肥大化するログファイルを退避させてくれるツールです。
通常であれば、「rotate」の項目で設定した世代分、「XXXX.1」「XXXX.2」などのように数値でログファイルが退避されていきます。
この数値は、週ごとに退避する周期に設定しているのであれば、「1週間前」「2週間前」に退避されたログファイルと分かりやすいのですが、実際に何日から何日までのログファイルが入っているかは内容を見てみないと分かりませんので、ローテーションされた後のファイル名を変更してみたいと思います。
logrotateを設定するには、/etc/logrotate.dディレクトリ以下に個別の設定ファイルを用意し、編集を行います。
ファイル名の最後にローテーションされた日付をつける
Apacheのログファイルを例にしてみましょう。
/var/log/httpd/*_log {
missingok
compress
rotate 1
size 0
sharedscripts
postrotate
EXT=`date -d '1 day ago' +%Y%m%d`
for f in $1;
do mv $f.1.gz $f.$EXT.gz;
done
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}
※ 「PC関係のメモ 」 を参考にさせていただきましたが、多少変更しています。
「rotate」(保存する世代数)は1以上を設定しておかなければ、ローテーション後に退避されたログファイルが残りません。
do mv $f.1.gz $f.$EXT.gz;
「compress」(ローテーション後に圧縮する)を指定しているため、「.gz」の拡張子のものをリネームするようにしています。
ただ、ローテーションした後のファイル名を変更してしまうと、世代数の管理(設定した世代数を超えた場合に、対象のログファイルを削除する)が行えません。
(logrotateは、ファイルの後についた数値で世代数を管理しているようなので、その数値がなくなってしまうと、世代が管理できなくなってしまいます)
手動で削除でもいいのですが、これでは少し手間になってしまいます。
あと、ローテーションされた日付を付け加えるのでもいいですが、1週間ごとの周期でローテーションさせた場合に具体的に、何日から何日までの週のログファイルかをファイル名に付け加えてみたいと思います。
ファイル名の最後にログが含まれる期間を付け加える
先ほどと同様に、Apacheのログファイルを例にして、ファイル名の末尾に対象期間をセットしてみます。
/var/log/httpd/*_log {
missingok
compress
rotate 1
size 0
sharedscripts
postrotate
S_DATE=`date -d '7 day ago' +%Y%m%d`
E_DATE=`date -d '1 day ago' +%Y%m%d`
DS_DATE=`date -d '77 day ago' +%Y%m%d`
DE_DATE=`date -d '71 day ago' +%Y%m%d`
for f in $1;
do mv $f.1.gz $f.$S_DATE-$E_DATE.gz
if [ -f $f.$DS_DATE-$DE_DATE.gz ]; then
rm $f.$DS_DATE-$DE_DATE.gz
fi
done
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}
例えば、今日(2007/03/15)実行した場合、「access_log」ファイルが「access_log.20070308-20070314.gz」という名前でローテーションされます。
(昨日の日付からになるのは、実行されるのが深夜とかを想定して)
また、古くなった世代のログファイルを自動で消すために、
DS_DATE=`date -d '77 day ago' +%Y%m%d` DE_DATE=`date -d '71 day ago' +%Y%m%d`
で、削除する対象になる期間のファイル名を指定し、該当のファイルがあった場合に削除しています。
上記の例では、10世代(10週分)保存し、11週目の週のデータ(71日前から77日前まで)の日付をファイル名に持つ、ログファイルを削除します。
「postotate」~「endscript」の箇所は、シェルスクリプトで記載できるのである程度複雑な処理もできます。
ただ、あまりに複雑な事をするぐらいなら、自分が慣れ親しんだ言語で初めから書き下ろした方が早い気がしますけどね。
[PR]スマートフォンならワイモバイル
関連記事
logrotateでログファイルの保存世代数が意図しない設定に上書きされてしまった件
簡単にファイル検索をするためのlocateコマンドオリジナル活用法
logrotateでログファイルがローテーションされない事への対処
不要なファイルやディレクトリを削除できる「tmpwatch」コマンド