画像やリンクが無効になっている可能性もあるのでご了承下さい。
Apache のログ管理は大半のディストリから RPM やらでインスコすると「logrotate」で
世代管理しつつローテーションされる。
個人的にはこの方法でローテーションされるのは嫌なので Apache 付属の「rotatelogs」を用いる。
なんで「logrotate」が嫌なのか? と言えばこれは環境にもよるけど、バーチャルホストでサブドメインを
多数運用している為、ホスト追加時には「/etc/logrotate.d/」以下のファイルにいちいちログファイル名を
追記してやらなければならないという事。
それともう一つは「HUP」シグナルが送られてリスタートさせられる事。これ気分的に嫌。
デフォルトだと大体こんな logrotate の設定になっているかと思う。
[text]/path/to/access_log {
daily
missingok
rotate 7
create
postrotate
/bin/kill -HUP `cat /path/to/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}[/text]
「/path/to」は該当ファイルまでのパスが環境により異なるので、適時置き換えて読んで下さい。
この場合、毎日定時でログがローテーションされ、7 世代(7 日)保持される事になる。
そして 7 行目にて HUP が該当プロセスに送られ Apache はリブートすると。
これでローテーションを行うログが増えると、丸々同じ物をファイル毎にどんどん追加していくか、
共通の設定で ok であるのならば 1 行目に「フルパス」でどんどんログファイル名を追加していく形になる。
はっきり言って面倒臭い。
なので Apache に付いてくる「rotatelogs」を使ってローテーションを行う事にする。
ただ、こいつの欠点は「ローテーションされたファイルは永久に残り続ける」という所。
今回はこの点を自分で shell 書いてみたので解決ということに。
rotatelogs の設定は Apache の設定ファイル内 CustomLogs ディレクティブにて行う。
うちの環境では毎日 00:00 キッカリにすぱっと切ってファイル名は「domainname_access_log.yyyymmdd」
ってな感じにしています。(ex yyyymmdd = 20080209)
conf ファイルの記述は以下の様な感じで。
CustomLog “| /usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/hostname_access_log.%Y%m%d 86400 +540” combined
86400 という数字は単位は「秒」。1 日 24 時間とする。
+540 は標準時からの時差補正。単位は「分」。日本は 9 時間ずれなので 540 となる。
実行ファイルのパスはまんまうちの環境でログの位置を変えないと~という所です (笑
この記述で Apache のログ吐き出しは rotatelogs をパイプ経由で通り、出力されます。
勿論日付が変わればその瞬間から rotatelogs の引数も瞬時に変わる為、実質これ勝手に
ローテーションということになる。
# Apache のアクセスログ解析ソフトにログ喰わせるとき、ファイル名から問題が出ると思うけど
# /var/tmp 以下へ適当にソフトリンク張ってそいつ読ませた後、リンクを消せば無問題であります。
残る課題は 2 つ。
まずは「残り続けるログファイル」。
これは自前で shell でも書いてやって対処は簡単。
ぶっち作成の物はこんな感じです。
[bash]#!/bin/sh
# Apache log Compress and remove to backup directry.
#
LOGDIR=/var/log/httpd
YM=`date –date=’1 month ago’ +%Y%m`
if [ -d ${LOGDIR} ]; then
cd ${LOGDIR};
else
printf ‘Log Directory does not exist…\n’;
exit 1;
fi
for i in `cat /root/dat/apachedomainname`;
do
if [ ! -e ./backup/${i}_access_log.${YM}.tar.gz ]; then
tar czvf ./backup/${i}_access_log.${YM}.tar.gz ${i}_access_log.${YM}*;
rm -f ${i}_access_log.${YM}*;
else
printf ‘Target file already exist!!\n’;
fi
done[/bash]
適当です。monthly で cron に喰わしてます。月単位の処理です。
これを参考にテストするなら「rm -f ~」の部分を「rm -i」に変えないともしもの時ログが消滅します。
「/root/dat/apachedomainname」なんてファイルがあるけど、これはバーチャルホストのサブドメイン名を
記述したファイルを作ってやってます。
こいつを喰わして予め用意した「backup」ディレクトリへ tar で固めて gzip で圧縮と。
とりあえずこれでログサイズを縮小して保存する事ができる。
もっとこの処理を行う周期を短くしたければ環境変数 YM を調整してください。
そしてもう一つの課題は「バックアップされたファイル自体の管理」となる。
今自分はこの点に問題を感じていないから何もしていません (笑
この手法に変えてから 7 ヶ月位かな。まだそれくらいしかないので…。
とはいってもサブドメインが多いのでそれなりの容量があったりするんで困りもの。
何れ対処しなければ行けないときがくるだろうけど、他のマシンに転送して削除とかやりそうだな (笑
以上、ぶっちゃけさっきスクリプトの Fix 入れてみたので、備忘録的記事でした。
コメント