質問: apache access_log を自動的にローテーションしたい および error_log ファイル. これを行う方法について、例を挙げて説明していただけますか?
答え: これは、以下で説明する logrotate ユーティリティを使用して実現できます。
次のファイルを /etc/logrotate.d ディレクトリに追加します。
# vi /etc/logrotate.d/apache /usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log { size 100M compress dateext maxage 30 postrotate /usr/bin/killall -HUP httpd ls -ltr /usr/local/apache2/logs | mail -s "$HOSTNAME: Apache restarted and log files rotated" [email protected] endscript }
注: logrotate オプションの使用方法の詳細については、logrotate チュートリアル (15 の例を含む) を参照してください。
上記の /etc/logrotate.d/apache の例では:
- サイズ 100M – access_log、および error_log が 100M に達すると、ローテーションされます。 100k (Kb の場合)、100G (GB の場合) も使用できます。サイズの代わりに、頻度 (毎日、毎週、毎月) を使用して Apache ログをローテーションすることもできます。
- 圧縮 – ローテーションされたログ ファイルが圧縮されることを示します。デフォルトでは、これは gzip を使用します。そのため、回転したファイルの拡張子は .gz になります。
- 日付テキスト – ローテーションされたログ ファイルに日付を YYYYMMDD 形式で追加します。つまり、access_log.1.gz の代わりに、access_log-20110616.gz を作成します
- 最大値 – ローテーションされたログ ファイルを保持する期間を示します。この例では、30 日間保持されます。
- postrotate と endscript – これら 2 つのパラメーターで囲まれたコマンドは、ログがローテーションされた後に実行されます。
重要: ログ ファイルをローテーションしたら、apache が新しいログ メッセージを新しく作成された access_log と error_log に書き込むようにします。したがって、ここに示すように、HUP シグナルを Apache に送信する必要があります。 /usr/bin/killall -HUP httpd を必ず実行してください。これにより、ログ ファイルのローテーション後に Apache が再起動されます (kill の詳細を参照してください)。
また、メールの本文として ls -ltr コマンドの出力とともに、ログ ファイルがローテーションされることを示すメールを自分自身に送信することもできます。つまり、「postrotate」オプションと「endscript」オプションの間に次を追加します (killall コマンドの後)。
ls -ltr /usr/local/apache2/logs | mail -s "$HOSTNAME: Apache restarted and log files rotated" [email protected]
/etc/cron.daily/logrotate スクリプトは毎日実行され、/etc/logrotate.conf で指定されたすべてのファイルと /etc/logrotate.d ディレクトリの下のすべてのファイルのログ ローテーションを実行します。
上記の /etc/logrotate.d/apache ファイルを追加した後、テスト目的で、以下に示すように logrotate スクリプトを手動で呼び出すことができます。
# /etc/cron.daily/logrotate
ログ ファイルがローテーションされたら、ls を実行して確認します。上で説明したように、ローテーションされたログ ファイルは 30 日間保持されます。
# ls /usr/local/apache2/logs access_log error_log access_log-20110716.gz error_log-20110716.gz