13. ログローテーションの最近のブログ記事

MacintoshのApacheのログローテーションはOSのログローテーション機能を使ってローテーションされています。 さすがMacintosh !
ただ、httpd.confでログのディレクトリを変更したり、履歴を多く残したいときは独自の変更が必要です。
通常、Apacheのログローテーション設定には、下記の2通りがあります。
1. ApacheのTransferLogディレクティブを使う方法
2. systemログ同様にOSの機能を使う方法
1. ApacheのTransferLogディレクティブを使う場合は、Apacheのコマンドであるrotatelogsをパイプでつないで下記の通り、httpd.confを変更します。
TransferLog "| rotatelogs /var/log/httpd/acess_log 86400"
但し、MacOS X 10.3.8に含まれているApacheには、rotatelogsコマンドが見当たりません。
なぜだろう?
最新版のApacheを独自に入れてもいいのですが、MacOS Xのセキュリティバージョンアップや定期的なバージョンアップで対応ができなくなるので、ApacheのTransferLogディレクティブを使う方法はやめることにしました。
2. systemログ同様にOSの機能を使う方法ですが、Linux, Sun Solarisとは少し異なっているようですね。
基本的には、crontabで定期的にローテーションする方法は変わらないので、まず、crontabを確認しましょう。 ファイルは、/etc/crontabです。
初期設定は、下記の通りです。
# Run daily/weekly/monthly jobs.
15 3 * * * root periodic daily
30 4 * * 6 root periodic weekly
30 5 1 * * root periodic monthly
minute hour mday month wday who commondで並んでいます。
定期的に、実行しているコマンドは、periodicです。 Macintoshの場合、periodicというコマンドが、一日単位、一週間単位、一ヶ月単位でログをローテーションしています。
periodicコマンドによって実行されるファイルは下記のディレクトリに格納されています。
/etc/periodic/daily/
/etc/periodic/weekly/
/etc/periodic/monthly/
例えば、/etc/periodic/daily/には、100.clean-logsと500.dailyというシェルスクリプトが入っています。100.clean-logsは不要となったログファイルを整理するシェルが記述されており、毎日実行されます。500.dailyは、scratch とjunkファイルの整理をしたり、netstatでログを取ったり、system.logのローテーションをしたり、httpdのログで7日以上たったファイルを消去したりしています。
httpdのログを消去するシェルスクリプトは、
後でわかりますが、実はApacheのログローテーション設定に矛盾がありますので、明記しておきます。
if [ -d /var/log/httpd ]; then
echo ""
echo -n "Cleaning web server log files:"
cd /var/log/httpd && ¥
find . -type f -name '*_log*' -mtime +7 -exec rm -f -- {} ¥; >/dev/null
2>&1;
fi
Apacheログのローテーションは、一週間単位でのローテーションとなっています。
設定ファイルは、/etc/periodic/weekly/500.weeklyです。
Apacheに関する部分は下記の通りで、最大5週間分のログをローテーションすることがわかります。
もっと残したい場合は、この部分を変更すればいいということになります。
私は、VirtualHostを使って、ログディレクトリを変更しているので、ディレクトリの変更とログローテーションを10週分(2ヶ月)することにしています。
cd /var/log/httpd
for i in access_log error_log; do
if [ -f "${i}" ]; then
echo -n " $i"
if [ -x /usr/bin/gzip ]; then gzext=".gz"; else gzext=""; fi
if [ -f "${i}.3${gzext}" ]; then mv -f "${i}.3${gzext}" "${i}.4${gzext}"
; fi
if [ -f "${i}.2${gzext}" ]; then mv -f "${i}.2${gzext}" "${i}.3${gzext}"
; fi
if [ -f "${i}.1${gzext}" ]; then mv -f "${i}.1${gzext}" "${i}.2${gzext}"
; fi
if [ -f "${i}.0${gzext}" ]; then mv -f "${i}.0${gzext}" "${i}.1${gzext}"
; fi
if [ -f "${i}" ]; then mv -f "${i}" "${i}.0" && if [ -x /usr/bin/gzip ];
then gzip -9 "${i}.0"; fi; fi
touch "${i}" && chmod 640 "${i}" && chown root:admin "${i}"
fi
done
if [ -f /var/run/httpd.pid ]; then /usr/sbin/apachectl restart; fi
echo ""
ログのファイル名を変更した場合、Apacheをリスタートしないと書き込みができないので、ログファイルをローテーションした後に、Apacheをリスタートしています。
ここで、MacOS Xの初期設定に矛盾があることに気がついたと思います。
Weeklyの設定では、最大5週間分のログを残すことができるのですが、Dailyの設定で、毎日7日以上経ったファイルを消しているので、access_log , access_log.0.gz , error_log , error_log.0.gz以外のログは見ることができないのです。
今まで、なぜ、ログが一世代前しか残せないか、もやもやした物がありましたが、これですっきりです。
思い切って、Dailyのhttpdのログを消去の部分を#でコメントアウトしましょう!



