だから、私はこの指令で何年も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変数が解析(および無視)され、残りのログ行が適切なファイルに書き込まれます。しかし、これはオーバーヘッドが少なくなるでしょうか?
他に何か提案はありますか?
開いているログファイルごとに、常にcronolog
のインスタンスが1つあります。 1つの解決策はここにあります: http://httpd.Apache.org/docs/2.2/logs.html#virtualhost ログファイルにvhost名を追加し、それを別々のファイルに分割することをお勧めします。必要です。
あなたが提案した他の可能な解決策:ロギングを仮想ホストごとのログに分割する独自のプログラム/スクリプトを作成します。また、すべてをsyslogに送信し、syslogホストで分割プログラムを実行することをお勧めします。このようにして、Apacheはログタイプごとに1つのファイル記述子のみを開いたままにします。当然、いくらかのオーバーヘッドがありますが、Apacheはファイル記述子の制限を使い果たしません。
名前付きパイプを使用できるかもしれません。
一般的に、gelraenの提案はかなり良いですが、そうするとローテーションを見逃してしまいます(syslogからcronologを呼び出すこともできますが、オーバーヘッドを減らすためにいくつかの追加のキューが必要になる場合があります)
http://httpd.Apache.org/docs/2.2/vhosts/fd-limits.html (gelraenから取得)
それを除いて、仮想ホストを配布するのに良い時期かもしれません。実際のマシンを購入する余裕がない場合でも、仮想マシンを使用できます。しかし、すべてを1台のサーバーに置くのは良い考えではないと思います。