web-dev-qa-db-ja.com

クロノログと仮想ホストのロギング

だから、私はこの指令で何年もcronologを使用しています:

<VirtualHost *:80>
  SetEnv Origin SND
  ServerName sandman.net
  CustomLog "|/usr/bin/cronolog [..]/logs/SND/log_%Y-%m.txt" combined
</VirtualHost>

問題は、多くの仮想ホストで、Apacheがcronologを生成しているときに、開いているファイル記述子の最大数に突然到達することです。

いくつかのグーグル(そしてここで検索)で、私はこれに対する解決策を見つけられなかったので、何もありませんか?ご覧のとおり、ApacheのENV変数をその仮想ホストの「SND」に設定しました。私がやりたいことは次のようなものです。

CustomLog "|/usr/bin/cronolog [..]/logs/${Origin}/log_%Y-%m.txt" combined
<VirtualHost *:80>
   SetEnv Origin SND
   ServerName sandman.net
</VirtualHost>

これは、理論的には、正しい仮想ホストログファイルに書き込むcronologプロセスを1つだけ生成します。

しかし、パイプコメンドはプロセスのどの段階でもApache変数に対して解析されていないようです。つまり、私が見ることができる唯一の解決策は、LogFormatに$ {Origin}を追加してから、独自のログローテーションスクリプトを作成することです。これにより、vhost変数が解析(および無視)され、残りのログ行が適切なファイルに書き込まれます。しかし、これはオーバーヘッドが少なくなるでしょうか?

他に何か提案はありますか?

1
Sandman

開いているログファイルごとに、常にcronologのインスタンスが1つあります。 1つの解決策はここにあります: http://httpd.Apache.org/docs/2.2/logs.html#virtualhost ログファイルにvhost名を追加し、それを別々のファイルに分割することをお勧めします。必要です。

あなたが提案した他の可能な解決策:ロギングを仮想ホストごとのログに分割する独自のプログラム/スクリプトを作成します。また、すべてをsyslogに送信し、syslogホストで分割プログラムを実行することをお勧めします。このようにして、Apacheはログタイプごとに1つのファイル記述子のみを開いたままにします。当然、いくらかのオーバーヘッドがありますが、Apacheはファイル記述子の制限を使い果たしません。

1
gelraen

名前付きパイプを使用できるかもしれません。

一般的に、gelraenの提案はかなり良いですが、そうするとローテーションを見逃してしまいます(syslogからcronologを呼び出すこともできますが、オーバーヘッドを減らすためにいくつかの追加のキューが必要になる場合があります)

http://httpd.Apache.org/docs/2.2/vhosts/fd-limits.html (gelraenから取得)

それを除いて、仮想ホストを配布するのに良い時期かもしれません。実際のマシンを購入する余裕がない場合でも、仮想マシンを使用できます。しかし、すべてを1台のサーバーに置くのは良い考えではないと思います。

0