Einfügen des Hostnamens in Apache Logwatch-Berichte

7

Wenn Sie mehrere Domains mit Apache hosten, ist es nützlich, die Logwatch-Apache-Ausgabe mit dem Namen des virtuellen Hosts anzuzeigen, aber ich erhalte nur:

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

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

während ich so etwas gerne hätte

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

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

Wie kann ich das mit logwatch erreichen?

Robert Munteanu
quelle
Ignorieren Sie den ersten Schritt, den Sie verwenden können. Http.apache.org/docs/1.3/logs.html
Rajat
Ich habe das gleiche Problem. Haben Sie das jemals gelöst?
Dunxd

Antworten:

4

Versuchen Sie dies (funktioniert für mich): Definieren Sie LogFormat in Ihrem httpd.confas

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

In diesem speziellen Fall haben Sie remote_address, Datum / Uhrzeit, [den Servernamen gemäß der Einstellung UseCanonicalName] , Anfrage, Satus-Code und Referer (das ist mein gewünschtes Format) und setzen dann

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

in Ihrer Datei services / http.conf LogWatch. Das wird

  1. Lassen Sie Apache den Hostnamen eingeben (Canonical oder nicht, es hängt davon ab, ob Sie% v oder% V verwenden).
  2. Erzwingen Sie, dass LogWatch Ihr Apache Access-Protokoll versteht

Hier ist ein Beispiel für die a-Zeile in der Protokollausgabe mit diesem bestimmten Satz von Anweisungen:

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 "

Wenn wir uns auf Fehlercodes konzentrieren und wie diese in LogWatch behandelt werden, können Sie folgende Änderungen an / usr / share / logwatch / scripts / services / http vornehmen : Hinzufügen:

mein $ my_host = ""; mein $ my_url = "";

Fügen Sie dann ungefähr in Zeile 462 diese Zeile hinzu, um unsere 4. Spalte (HOST) zu speichern:

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

Und in Zeile 560, nachdem fmt_urlshorten ( if (length($field{url}) > 60) {...}) hinzugefügt wurde:

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

Zum Schluss ändern Sie:

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

durch

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

Wenn Sie dies tun, haben Sie Folgendes in Ihrer Logwatch:

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

Ich hoffe es hilft euch allen

Syquus
quelle
Ist der Unterschied zwischen den beiden Definitionen "[% V]" und "% V" beabsichtigt? Ich habe versucht, das zum Laufen zu bringen, aber bisher kein Glück. Ich stelle fest, dass die Domäne in der Beispielprotokollausgabe keine eckigen Klammern hat.
Contrebis
4

Ich hatte das gleiche Problem und löste es durch Ändern des LogFormatIn apache.conf( 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

Dies generiert die gleiche Ausgabe wie die Standardeinstellung und fügt den kanonischen Servernamen als Präfix hinzu. Z.B:

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

Der Vorteil ist, dass Sie keine weiteren Anpassungen benötigen (z. B. auf der Logwatch-Seite). Der Nachteil ist, dass Sie für jede protokollierte Zeile ein paar zusätzliche Zeichen erhalten.

Vassil
quelle
1

Ich denke nicht, dass es möglich ist, wenn Sie alle virtuellen Domänen in derselben Protokolldatei protokollieren ... Das Apache-Protokoll unterscheidet nicht zwischen ihnen.

Ich würde auch vorschlagen, dass Sie sich das Open Source OSSEC ansehen . Wir sind von Logwatch zu Logwatch gewechselt, weil es in Echtzeit ist und eine zentralisierte Korrelation ermöglicht (Korrelation von Dingen wie fehlgeschlagener SSH-Anmeldung mit Apache 400-Fehlern).

sucuri
quelle
0

Sie können den Hostnamen mithilfe der LogFormat-Direktive in der Apache-Konfiguration abrufen. Sie können die folgende Option verwenden

%{Host}i

Ich habe diese Informationen in diesem Link gefunden . Logwatch sollte in der Lage sein, benutzerdefinierte Informationen zu analysieren.


quelle
0

Vielen Dank an @Syquus, der mich auf den richtigen Weg gebracht hat, um die /usr/share/logwatch/scripts/services/httpDatei zu ändern .

Meine Datei und Lösung waren unterschiedlich, aber ich dachte, ich würde sie trotzdem teilen.

Ich verwende das von vhost_combinedApache bereitgestellte Standard- LogFormat, das wie folgt aussieht:

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

welches etwas ausgibt wie:

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"

Ich habe dies in die Dienstkonfigurationsüberschreibung gesetzt unter /etc/logwatch/conf/services/http.conf:

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

Nachdem ich die ungefähr richtigen Stellen gefunden hatte, an denen die Änderungen für die @ Syquus-Lösung vorgenommen werden sollten /usr/share/logwatch/scripts/services/http, dachte ich, dass es funktionieren würde, einfach den Index von [3] auf [0] zu ändern - das tat es nicht. Ich habe falsche Segmente des Pfades erhalten und selbst nach dem Durchlaufen des gesamten Hashs / ​​Arrays habe ich den Hostnamen nicht gefunden. Das Debuggen war frustrierend, weil ich neu bei Perl bin, aber meine Lösung bestand darin, das Matching für das zu verwerfende hinzuzufügen %vund dann die URL weiter unten zu ändern, um den Domainnamen einzuschließen.

Diff für meine Lösung (ich habe auch die URL-Kürzung entfernt), 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) &&

Sollte ich mich dazu entschließen, gesicherten Inhalt oder Inhalt an einem anderen Port als: 80 bereitzustellen, könnte ich ihn in Zukunft einbinden. Es sollte jetzt klar sein, wie.

Hoffe das hilft!

AKTUALISIEREN

Einige weitere Änderungen vorgenommen, ein Fehler behoben. Anstatt Bewahren Sie diese Antwort bearbeiten , können Sie meine Änderungen finden Sie hier: https://bitbucket.org/ubiquitypress/logwatch

lsh
quelle