Cronolog対logrotate


回答:


14

私の経験では、logrotateは素晴らしいです。非常に柔軟で、ほとんどのソフトウェアでうまく機能します。

ただし、それにはいくつかの問題があり、cronologは主にWebログローテーション機能であるため、問題のあったlogrotate + apacheの経験を書き留めます。

logrotateがaccess.logの名前をaccess.log.1に変更したとしても、apacheはiノードへの書き込み中にaccess.log.1への書き込みを継続するため、ログを回転する場合、ログが回転されていることをapacheに通知する必要があります。ファイルの名前を変更しても、iノード番号には影響しません。

Debianエッチ(およびおそらく他の多くのディストリビューション)では、Apacheログを回転させるためにlogrotateが使用されています。現在、Apacheにはグレースフルリスタートがあり、既存の接続の処理が終了したらapacheの子プロセスを終了し、Apacheがその構成を再読み取りし、新しい子プロセスを生成して、新しいログファイルへの書き込みを開始します(前のプロセスが回転)。

これは素晴らしい解決策のように思えますが、グレースフルリスタートは特定の条件(高負荷など)で常に機能しないため、debian開発者はapache logrotate構成でグレースフルリスタートの代わりにapacheリスタートを使用することにしました。残念ながら、これによりすべての接続が一度にドロップされます。これは、負荷の高いサイトにとっては非常に悪いことです。さらに、Apacheの再起動は、Apacheの停止や起動などの問題を引き起こす可能性もあります(特定の負荷状況でも)。詳細については、以下のバグリンクを参照してください。

一番下の行は、logrotateは素晴らしいですが、特定のプログラムの特定の問題につながる可能性があります。私はcronologの経験はあまりありませんが、パイプを介してログを書き込むので、ログファイルをローテーションするときにApacheのリロードは必要ありません。これは基本的に上記のすべてを解決します。

関連するlogrotate / apache debianのバグ:

  1. Debianバグ#301702
  2. Debianバグ#400455

1
上記の解決策は、truncateを使用することです!それは、access.logの内容をaccess.log.1にコピーしてから、access.logを空にすることです(access_logのiノードの残りは同じままです)。通常、数GBを超えるログ(最悪の場合)がないため、プロセス全体に時間がかかりません!
ニコライディスフォティス

3

私はcronologを好みますが、それは本当に強い好みではありません。

cronによって開始された場所でlogrotateを実行し、何らかの理由でローテーションが発生したはずのときにシステムがダウンした場合、ログファイルはローテーションされません。

また、ログファイルには長期間保存するため、名前に日付(%Y%m.combined.access.log)が含まれているログファイルが好きです。ほとんどのシステムでは、デフォルトで、apache logrotateはファイルにaccess.log、access.log.1などの名前を付けます。logrotateを使用してログファイルの日付を使用することは可能かもしれませんが、前回見たときの方法を理解できませんでした。


2
cron時間を過ぎてもlogrotateが機能しない問題は、「anacron」パッケージをインストールすることで修正できます。
andrewd18

または、さらに望ましい形式でログを保存することができます-これはrsyslogのテンプレートを使用して実行できます-(%year%-%month%-%day%_lala.log)この場合、毎日名前が変更されるため、ログをローテーションする必要さえありません!
ニコライディスフォティス


2

私はほとんど独占的に使用cronologlogrotateます。 logrotateDebianに付属しており、メールサーバーログなどのシステムサービスで動作し続けることができます。しかし、Apacheとlighttpdログファイルについては、すべてcronologです。

私が使用する理由の1つcronologは、すべての構成がWebサーバー構成のログファイル行で行われることです。

たとえば、lighttpd設定ファイルに次のように入力できます。

accesslog.filename = "|/usr/bin/cronolog --symlink=/var/log/webs/access.log /var/log/webs/%Y/%W-access.log"

そして、他の設定なしで毎週新しいログファイルを取得します。または、創造的になって次のようなことをすることもできます。

accesslog.filename = "|/usr/bin/cronolog --symlink=/var/log/webs/access.log /var/log/webs/%Y/%m/%a-access.log"

また、曜日ごとにトラフィックを示すログファイルを取得します。たとえば、すべての日曜日、すべての火曜日。

さらに良いのは、サーバーが少しの間ダウンしていても、再起動時に正しいログファイルが使用されることです。


1
これは(runitおよびdaemontools系統の)svlogdによく似ています。
東武
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.