web-dev-qa-db-ja.com

Apacheログウォッチレポートにホスト名を含める

Apacheで複数のドメインをホストする場合、仮想ホスト名が含まれているログウォッチApacheの出力を確認すると便利ですが、次の情報しか得られません。

 --------------------- httpd Begin ------------------------

 Requests with error response codes
   400 Bad Request
      /: 1 Time(s)
      /robots.txt: 1 Time(s)

私は何かが欲しいのに対して

 --------------------- httpd Begin ------------------------

 Requests with error response codes
   400 Bad Request
      example.com/: 1 Time(s)
      example.org/robots.txt: 1 Time(s)

Logwatchでこれをどのように達成できますか?

7
Robert Munteanu

これを試してください(私にとってはうまくいきます):_httpd.conf_でLogFormatを次のように定義します

LogFormat "%h%t [%V] \"%r\"%> s \"%{Referer} i\""

この特定のケースでは、remote_address、date/time、[UseCanonicalName設定に従ったサーバー名]、リクエスト、satusコード、およびリファラーがあります。 (それが私の希望するフォーマットです)そして

$ LogFormat "%h%t%V \"%r\"%> s \"%{Referer} i\""

services/http.confLogWatchファイル内。それは

  1. apacheにホスト名を設定させます(正規かどうか、%vまたは%Vのどちらを使用するかによって異なります)
  2. logWatchにApacheアクセスログを理解させる

これは、この特定のディレクティブのセットを含むログ出力の行の例です。

172.3.20.11 [01/Jun/2011:21:00:52 +0200] joomla.local "GET /images/tabs_back.png HTTP/1.1" 404 " http://joomla.local/templates/beez_20 /css/personal.css "

エラーコードに焦点を当て、それらがLogWatchでどのように扱われるかについて、/ usr/share/logwatch/scripts/services/httpに加えることができるいくつかの変更を次に示します。追加:

私の$ my_Host = "";私の$ my_url = "";

次に、行462について、次の行を追加して4番目の列(ホスト)を保存します。

$ field {my_Host} = $ field {$ log_fields [3]};

そして、560行目で、_fmt_url_が短縮された後(if (length($field{url}) > 60) {...})、次を追加します。

_$my_Host = $field{$log_fields[3]};
$my_Host = substr($my_Host,1);
$my_url=$my_Host . $fmt_url;
_

最後に、変更します。

_$needs_exam{$field{http_rc}}{$fmt_url}++;_

沿って

_$needs_exam{$field{http_rc}}{$my_url}++;_

そうすることで、Logwatchに次のように表示されます。

_Requests with error response codes
404 Not Found
joomla.local/images/tabs_back.png: 3 Time(s)
_

私はそれがあなたのすべてを助けることを願っています

4
Syquus

同じ問題が発生し、Apache.confLogFormatを変更して解決しました( http://httpd.Apache.org/docs/2.2/mod/mod_log_config.html

# LogFormat "%h %l %u %t \"%r\" %>s %O" common

# The default output has no info about the server name (%v).
# %m %U%q %H is strictly equivalent to %r.
LogFormat "%h %l %u %t \"%m %v%U%q %H\" %>s %O" common

これにより、デフォルトと同じ出力が生成され、正規のサーバー名がプレフィックスとして追加されます。例えば:

... "GET www.example.com/Apache_pb.gif HTTP/1.0" 200 2326 ... 

長所は、他のカスタマイズ(ログウォッチ側など)が必要ないことです。短所は、ログに記録された行ごとにいくつかの余分な文字を取得することです。

3
Vassil

私は見つけました この問題と誰かがそれをどのように解決したかを詳述しているブログ投稿 。これがログ分析にどのように影響するかはわかりませんが、便利だと思ったのでここに注意してください。

1
dunxd

すべての仮想ドメインを同じログファイルに記録している場合は不可能だと思います... Apacheログはそれらを区別しません。

また、オープンソースをご覧になることをお勧めします [〜#〜] ossec [〜#〜] 。ログウォッチからログウォッチに移行しました。これは、リアルタイムであり、一元化された相関関係(sshのログイン失敗とApache 400エラーなどの相関関係)が可能であるためです。

1
sucuri

ホスト名は、Apache構成のLogFormatディレクティブを使用して取得できます。次のオプションを使用できます

%{Host}i

私はこの情報を このリンク で見つけました。 Logwatchはカスタム情報を解析できる必要があります。

0
Fran6co

_/usr/share/logwatch/scripts/services/http_ファイルを変更する正しい道を教えてくれた@Syquusに感謝します。

私のファイルとソリューションは異なっていましたが、私はすべて同じことを共有すると思いました。

Apacheが提供する次のような標準の_vhost_combined_ LogFormatを使用します。

_LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined_

これは次のようなものを出力します:

example.org:80 1.1.1.1 - - [08/Oct/2013:16:55:01 +0000] "GET / HTTP/1.1" 200 6094 "-" "Opera/9.80 (X11; Linux x86_64; Edition Linux Mint) Presto/2.12.388 Version/12.16"

これを_/etc/logwatch/conf/services/http.conf_のサービス構成オーバーライドに入れました:

_$logformat = "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\""
_

_/usr/share/logwatch/scripts/services/http_で@Syquusのソリューションを変更するためのほぼ正しい場所を見つけた後、インデックスを[3]から[0]に変更するだけでうまくいくと思いましたが、うまくいきませんでした。パスの誤ったセグメントを取得し、ハッシュ/配列全体をトラバースした後でも、ホスト名が見つかりませんでした。私はPerlを初めて使用するため、デバッグはイライラしましたが、私の解決策は、破棄されていた_%v_のマッチングを追加し、さらに下のURLを変更してドメイン名を含めることでした。

私のソリューションの相違(URLの切り捨ても削除しました)、YMMV:

_--- __http.2013-10-09   2013-10-09 13:11:48.000000000 +0000
+++ http        2013-10-09 14:36:59.000000000 +0000
@@ -132,6 +132,8 @@
 #  Build tables of the log format to parse it and determine whats what
 #

+my $my_url = "";
+
 my $detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
 my $ignoreURLs = $ENV{'http_ignore_urls'};
 my $ignoreIPs = $ENV{'http_ignore_ips'};
@@ -379,7 +381,10 @@
 $logformat =~ s/%[\d,!]*/%/g;
 while ($end_loop) {

-   if ($logformat =~ /\G%h/gc) {
+   if ($logformat =~ /\G%v/gc) {
+      $parse_string[$parse_index] .= "(\\S*?)";
+      $parse_field[$parse_index][$parse_subindex++] = "my_Host";
+   } elsif ($logformat =~ /\G%h/gc) {
       $parse_string[$parse_index] .= "(\\S*?)";
       $parse_field[$parse_index][$parse_subindex++] = "client_ip";
    } elsif ($logformat =~ /\G%l/gc) {
@@ -437,7 +442,6 @@
 #
 #  Process log file on stdin
 #
-
 while (my $line = <STDIN>) {
    chomp($line);

@@ -580,11 +584,12 @@
          !((defined $ignoreURLs) && ($field{url} =~ /$ignoreURLs/)) &&
          !((defined $ignoreIPs) && ($field{client_ip} =~ /$ignoreIPs/)) ) {
       my $fmt_url = $field{url};
-      if (length($field{url}) > 60) {
-         $fmt_url = substr($field{url},0,42) . " ... " .
-                    substr($field{url},-15,15);
-      }
-      $needs_exam{$field{http_rc}}{$fmt_url}++;
+      #if (length($field{url}) > 60) {
+      #   $fmt_url = substr($field{url},0,42) . " ... " .
+      #              substr($field{url},-15,15);
+      #}
+      $my_url = $field{my_Host} . $fmt_url;
+      $needs_exam{$field{http_rc}}{$my_url}++;
    }
    if (defined $field{userid} && $field{userid} ne "-" &&
          (eval $user_display) &&
_

安全なコンテンツまたは:80以外のポートでコンテンツを提供することにした場合、将来それを含める可能性があります。どのようになったかは今や明らかなはずです。

お役に立てれば!

更新

さらにいくつかの変更を加え、バグを修正しました。この回答を編集し続けるのではなく、ここで私の変更を見つけることができます: https://bitbucket.org/ubiquitypress/logwatch

0
lsh