私は多くの仮想ホストをWebサーバーにセットアップしており、それぞれに独自のエラーとアクセスログがあります。 httpd.conf
の関連する行は次のようなものです:
ErrorLog /var/log/httpd-error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access.log combined
NameVirtualHost *:80
<VirtualHost *:80>
ServerName myhost.com
ServerAlias www.myhost.com
DocumentRoot /var/www/myhost.com/htdocs
ErrorLog /var/www/myhost.com/log/error.log
CustomLog /var/www/myhost.com/log/access.log combined
</VirtualHost>
# ... many more VirtualHosts
現在、/ var/log/httpd-error.logにランダムなエラーがいくつか表示されていますが、/ var/log/httpd-access.logには何も表示されていません。すべてのアクセスとエラーを共有ログファイルに複製することは可能ですか?新しいエントリをすべてのVirtualHostに追加せずにこれを行うことは可能ですか?
参照 http://httpd.Apache.org/docs/2.2/logs.html#virtualhost
CustomLogまたはErrorLogディレクティブがセクション内に配置されている場合、その仮想ホストに対するすべての要求またはエラーは、指定されたファイルにのみ記録されます。ロギングディレクティブのない仮想ホストは、メインサーバーのログにリクエストが送信されます。
つまり、VirtualHostセクション内にLoggingディレクティブを配置すると、メインサーバー構成内のLoggingディレクティブが上書きされます。単一のログファイルにログを記録する場合は、VirtualHostセクションからログ構成を削除します。
簡単にするために、私はすべてのAccessデータを単一のログファイルに記録することを好みます。後で、ログを処理し、ログファイルを仮想ホストのログファイルに分割できます。また、単一のログファイルに書き込む方が、一度に30個のログファイルに書き込むよりも、コンピューターリソースを効率的に使用できます。 LogFormatに仮想ホストの名前を記録する「%v」が含まれていることを確認してください。
すべてのアクセスとエラーを共有ログファイルに複製することは可能ですか?
すべてのエラーをログに記録し、共有ログファイルにアクセスできますが、ログファイルは醜いです。まず、Apacheログデータをsyslogに送信してから、syslogを使用してローカルファイルまたはリモートログサーバーに送信します。
# Send access logs to syslog
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined
# Send error logs to syslog
ErrorLog syslog:local7
そして/etc/syslog.conf
# Send all HTTP log data to this file
local7.* /var/log/http-all.log
私がやったことは、VirtualHostセクションに2番目のCustomLog行を追加することでした。しかし、私はすべてのvhost confファイルごとにこれを行わなければなりませんでした。それは機能し、私のテンプレートに含まれているので、新しいvhostsが使用されます。
私のApache2はヒットを2つの場所に記録します。
/var/log/Apache2
すべての仮想ホストの結合ファイル。もちろん、これら2つのログのそれぞれに異なるLogFormatを適用して、それぞれに対応します。 /var/log/Apache2
ログはPerlで解析され、分析とレポートのために高度に正規化されたMySQL構造に吸い込まれます。 Logrotateは週に1回スイープします。
すべての仮想ホストのライブログを1か所で確認したい場合は、次のように入力します。
tail -f /var/www/*/access.log
同じルールがgrepを使用した猫にも適用されます。
cat /var/www/*/access.log | grep "something"
または、ログローテーションでファイルが既に圧縮されている場合:
gzip -d /var/www/*/access.log.2.gz
例はDebian/Ubuntuでテストされています
ログファイルの場所が仮想ホスト全体で何らかのパターンに従うかどうかはわかりませんが、そうである場合は、Apacheが重複したログを作成することを忘れて、必要なときにログを記録するだけです。
cat /var/www/*/log/access.log > /var/www/logs/access.log
これは可能ではないと思います。少なくとも documentation はそのようなことについて言及していません。
この種の動作をシミュレートする最良の方法は、%vタグをフォーマットで定義し、ログローテーション時にログファイルのコピーを仮想ホスト固有のファイルに分割することです。
すべてのアクセスログを監視することは厳密に必要ですか?エラーが仮想ホストのリクエストによって実際に発生した場合、仮想ホストのエラーログに何かが記録されているはずです。その場合、ls -t /var/www/*/log/error.logを実行して、どのvhostが原因であるかを特定し、そのアクセスログファイルのみを監視することで、不要なログの読み取りをなくすことができます。 。
私もこの質問への回答を探しています。これまでのところ、2つの解決策があります。
tail -f /var/log/httpd/*access_log
tail -f
ホスト上のすべてのWebサーバーアクティビティを表示します。ただし、tailが複数のファイルを処理する方法があまり好きではないため、1つのファイルだけをtailできるようにしたいと思っています。
ErrorLogディレクティブを使用すると2つの可能性があります http://httpd.Apache.org/docs/2.2/mod/core.html#errorlog
1)syslogを使用して、[r] syslog.confの複製を処理します
2)パイプを使用して、ログエントリをアプリケーション/スクリプトに送信し、そのアプリケーション/スクリプトの複製を処理する