web-dev-qa-db-ja.com

Apacheバーチャルホストでの「キャッチオール」アクセスログ?

私は多くの仮想ホストを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に追加せずにこれを行うことは可能ですか?

16
pix0r

参照 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
17

私がやったことは、VirtualHostセクションに2番目のCustomLog行を追加することでした。しかし、私はすべてのvhost confファイルごとにこれを行わなければなりませんでした。それは機能し、私のテンプレートに含まれているので、新しいvhostsが使用されます。

私のApache2はヒットを2つの場所に記録します。

  1. その仮想ホストのディレクトリにある仮想ホストの詳細と
  2. /var/log/Apache2すべての仮想ホストの結合ファイル。

もちろん、これら2つのログのそれぞれに異なるLogFormatを適用して、それぞれに対応します。 /var/log/Apache2ログはPerlで解析され、分析とレポートのために高度に正規化されたMySQL構造に吸い込まれます。 Logrotateは週に1回スイープします。

2
pholt

すべての仮想ホストのライブログを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でテストされています

1
trojan

ログファイルの場所が仮想ホスト全体で何らかのパターンに従うかどうかはわかりませんが、そうである場合は、Apacheが重複したログを作成することを忘れて、必要なときにログを記録するだけです。

cat /var/www/*/log/access.log > /var/www/logs/access.log
0
joebert

これは可能ではないと思います。少なくとも documentation はそのようなことについて言及していません。

この種の動作をシミュレートする最良の方法は、%vタグをフォーマットで定義し、ログローテーション時にログファイルのコピーを仮想ホスト固有のファイルに分割することです。

0
Kimvais

すべてのアクセスログを監視することは厳密に必要ですか?エラーが仮想ホストのリクエストによって実際に発生した場合、仮想ホストのエラーログに何かが記録されているはずです。その場合、ls -t /var/www/*/log/error.logを実行して、どのvhostが原因であるかを特定し、そのアクセスログファイルのみを監視することで、不要なログの読み取りをなくすことができます。 。

0
Jeremy M

私もこの質問への回答を探しています。これまでのところ、2つの解決策があります。

  1. catソリューションジョーバートが言及
  2. 私自身のテールソリューション:tail -f /var/log/httpd/*access_log

tail -fホスト上のすべてのWebサーバーアクティビティを表示します。ただし、tailが複数のファイルを処理する方法があまり好きではないため、1つのファイルだけをtailできるようにしたいと思っています。

0
Scott Johnson

ErrorLogディレクティブを使用すると2つの可能性があります http://httpd.Apache.org/docs/2.2/mod/core.html#errorlog

1)syslogを使用して、[r] syslog.confの複製を処理します

2)パイプを使用して、ログエントリをアプリケーション/スクリプトに送信し、そのアプリケーション/スクリプトの複製を処理する

0
lrosa