ログをローテーションするときにApacheのリロードを回避する方法は?


25

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のリロードを回避する方法はありますか?

回答:


42

Apacheがリロードを必要とする理由は、ファイルを開くと、ファイルハンドルを取得し、そのファイルハンドルへの書き込みを継続するためです。ファイルを移動しても、それは表示されず、同じハンドルへの書き込みを続けるだけです。リロードを行うと、ファイルが再び開かれ、新しいハンドルが取得されます。

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

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}

ご回答有難うございます。だからlastaction echo "" | /apache/*log endscript、ファイルハンドルを追加すると「失われない」と思いますか?
ハープ

3
申し訳ありませんが、「コピー」の代わりに「コピートランケート」と言うべきでした。そうすれば、最後のアクションはまったく必要ありません。カフェインの流れに血液が多すぎると思う:
ジェニーD

チャームのように機能します:)
ハープ

4
@harpは注意してlogrotateください、「ファイルをコピーしてから切り捨てるまでのタイムスライスは非常に短いため、一部のログデータが失われる可能性があります。」
トーター

一部のデータが失われる可能性以外に、使用する他の既知の欠点はありますcopytruncateか?
レオガレギヨス

5

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

1
Webサーバーへのトラフィックが多い場合、外部プログラムへの配管が問題になる可能性があります。ただし、ファイルハンドルの問題はきちんと回避されます。
ジェニーD

良い選択肢のように見えます。cronologはオンザフライで圧縮しますか?
ハープ

apache2-utilsパッケージには、同様のアプリ「rotatelogs」があります。異なるApache仮想サーバーから同じログファイルに「パイプ」しないように注意してください-それらは互いに踏みつけます。
アリースクリアルーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.