Apache Virtual Hostsを使用した「キャッチオール」アクセスログ


16

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に新しいエントリを追加せずにこれを行うことは可能ですか?

回答:


17

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

2

VirtualHostセクションに2番目のCustomLog行を追加しました。ただし、vhost confファイルごとにこれを行う必要がありました。これは機能し、テンプレートに含まれているため、新しい仮想ホストが使用されます。

私のapache2は、ヒットを2つの場所に記録するようになりました。

  1. その仮想ホストのディレクトリ内の仮想ホストの詳細と
  2. /var/log/apache2すべてのバーチャルホストのための結合ファイルインチ

もちろん、それぞれに対応するために、これら2つのログのそれぞれに異なるLogFormatを適用します。/var/log/apache2ログは、Perlで解析し、解析および報告のための高度に正規化されたMySQLの構造内に吸引されます。ログローテートは週に1回掃引します。


1

すべての仮想ホストのライブログを1か所で見たい場合は、次のように入力できます。

tail -f /var/www/*/access.log

grepを使用したcatにも同じルールが適用されます。

 cat /var/www/*/access.log | grep "something"

または、ログローテーションが既にファイルを圧縮している場合:

gzip -d /var/www/*/access.log.2.gz

例はDebian / Ubuntuでテストされています


0

これは可能だとは思いません。少なくともドキュメントではそのようなことについて言及していません。

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


0

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

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

0

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

  1. 言及したソリューションjoebert
  2. 私自身のテールソリューション: tail -f /var/log/httpd/*access_log

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


マルチテールを取得します。とても便利です。
ティル

0

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

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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.