web-dev-qa-db-ja.com

ログをローテーションするときにApacheのリロードを回避するにはどうすればよいですか?

Logrotateを使用して、Apacheのアクセスログ、エラーログ、および書き換えログをローテーションします。私の設定ファイルは次のようになります:

/Apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/Apache
    notifempty
    missingok
    lastaction
     /bin/Apache reload
    endscript
}

私の問題は、ローテーションが発生するたびにApacheをリロードする必要があることです。これは、Apacheが回転したばかりのログファイルにこれ以上書き込みを行わないためです。 logrotateがローテーションを行うたびにApacheがリロードしないようにする方法はありますか?

25
harp

Apacheがリロードを必要とする理由は、ファイルを開くと、ファイルハンドルを取得し、そのファイルハンドルに書き込みを続けるためです。ファイルを移動しても、そのことはわかりません。同じハンドルに書き続けるだけです。リロードを実行すると、ファイルが再度開かれ、新しいハンドルが取得されます。

リロードを回避するには、ファイルを移動する代わりに、ファイルをコピーして古いファイルを空にします。そうすることで、Apacheは同じファイルハンドルへの書き込みを続けることができます。これを行うには、次のようにオプション "copytruncate"をlogrotate構成ファイルに追加します。

/Apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/Apache
    notifempty
    missingok
}
42
Jenny D

http://cronolog.org/ を使用することをお勧めします

これは私がそれを使う方法です:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined
5
Boris Ivanov