Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 15 Die Praxis
  gp 15.1 Alltägliche Lösungen
    gp 15.1.1 Auf alphabetische und numerische Zeichen prüfen
    gp 15.1.2 Auf Integer überprüfen
    gp 15.1.3 echo mit oder ohne -n
  gp 15.2 Datei-Utilities
    gp 15.2.1 Leerzeichen im Dateinamen ersetzen
    gp 15.2.2 Dateiendungen verändern
    gp 15.2.3 Nach veränderten Dateien in zwei Verzeichnissen vergleichen
  gp 15.3 Systemadministration
    gp 15.3.1 Benutzerverwaltung
    gp 15.3.2 Systemüberwachung
  gp 15.4 Backup-Strategien
    gp 15.4.1 Warum ein Backup?
    gp 15.4.2 Sicherungsmedien
    gp 15.4.3 Varianten der Sicherungen
    gp 15.4.4 Bestimmte Bereiche sichern
    gp 15.4.5 Backup über ssh mit tar
    gp 15.4.6 Daten mit rsync synchronisieren
    gp 15.4.7 Dateien und Verzeichnisse per E-Mail versenden
    gp 15.4.8 Startup-Scripts
  gp 15.5 World Wide Web und HTML
    gp 15.5.1 Analysieren von access_log (Apache)
    gp 15.5.2 Analysieren von error_log (Apache)
  gp 15.6 CGI (Common Gateway Interface)
    gp 15.6.1 CGI-Scripts ausführen
    gp 15.6.2 CGI-Environment ausgeben
    gp 15.6.3 Einfache Ausgabe als Text
    gp 15.6.4 Ausgabe als HTML formatieren
    gp 15.6.5 Systeminformationen ausgeben
    gp 15.6.6 Kontaktformular
    gp 15.6.7 Noch ein Tipp


Rheinwerk Computing

15.5 World Wide Web und HTMdowntop

Der Umgang mit Logdateien gehört zu einem weiteren wichtigen Bereich eines Systemadministrators. Schließlich stellen die Log(-bücher) so etwas wie das Tagebuch eines Webservers dar. Dort hinein wird immer dann etwas geschrieben, wenn etwas passiert. So kann man mit einem Blick in die Logdateien recht schnell feststellen, ob alles seine Ordnung hat. Allerdings befinden sich in solchen Logdateien häufig unglaublich viele Informationen. Das Problem ist weniger, an diese Informationen zu kommen, sondern vielmehr die wichtigen Informationen daraus zu gewinnen.

In den folgenden Beispielen sollen nur die Logdateien access_log und error_log des Apache Webserver betrachtet werden, zwei Logfiles, die der Apache standardmäßig als Tagebuch verwendet. Da der Apache wie auch viele andere Webserver das Common Log Format verwendet (einen informellen Standard) sollte es nicht schwer sein, nach diesem Kapitel auch Logdateien anderer Server auszuwerten. Wobei sich wohl die meisten mit den Logfiles des Apache zufrieden geben dürften, da dieser mit gut 60 % Marktanteil (vor allem unter den Webhostern) der verbreitetste ist. Wo (und ggf. auch was) der Apache in diese beiden Logfiles schreibt, wird gewöhnlich in httpd.conf festgelegt.

Anhand dieser beiden Logfiles werden übrigens die tollen Statistiken erzeugt, die Ihnen Ihr Webhoster anbietet. Darin finden Sie Zugriffszahlen, Transferraten (gesamt, Tagesdurchschnitt ...), den Browser, Fehlercodes (z. B. »Seite nicht vorhanden«) die IP-Adresse oder Domain-Adresse des Clients, Datum, Uhrzeit und eine Menge mehr.

Als normaler Inhaber einer Domain mit ssh-Zugang werden Sie das eine oder andere Mal diese Logfiles wohl auch mit einem Script auswerten wollen. Als Systemadministrator eines Webservers werden Sie dies allerdings zu einer Ihrer Hauptaufgaben machen und diese Logfiles auch archivieren müssen. Wie dem auch sei, wir begnügen uns mit dem Einfachsten, und zwar dem Auswerten der Logfiles, um den Inhalt in einer vernünftigen Form lesbar darzustellen.


Rheinwerk Computing

15.5.1 Analysieren von access_log (Apache)  downtop

Die access_log-Datei ist eine einfache Textdatei, in der der Webserver bei jedem Besucher, der eine Webseite besucht, einen Eintrag in folgender Form oder ähnlich hinterlässt (eine Zeile):

169.229.76.87 – – [13/May/2001:00:00:37 –0800]
"GET /htdocs/inhalt.html HTTP/1.1" 200 15081 
"http://www.irgendwoher.de/links.html"
"Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"

Was sagt die Zeile:

gp  169.229.76.87 – die IP-Adresse oder der Domainname des Rechners/ Benutzers, auf dem der Browser (Client) ausgeführt wird. Gewöhnlich wird der Hostname dabei als IP-Adresse angegeben. Der Administrator kann aber die Direktiven HostNameLookups in httpd.conf auf On setzen (standardmäßig steht diese auf Off). Dann versucht der Apache den Namen aufzulösen, indem er einen Namenserver abfragt.
gp  - (erster Strich) – Identität des Rechners/Benutzers. Der Name wird nur dann übertragen, wenn er über einen ident-Daemon ermittelt werden kann. Der ident-Daemon ist ein Identifikationsdienst unter Linux-UNIX. Ist dies nicht der Fall (meistens), sehen Sie hier ein Minuszeichen.
gp  - (zweiter Strich) – Login-Name des Benutzers, falls eine Passwort/Benutzername-Authentifizierung erforderlich ist.
gp  [13/May/2001:00:00:37 +0200] – Zeitstempel des Servers zum Zeitpunkt des Zugriffs, mit Datum, Uhrzeit und Zeitinformationen relativ zu GMT.
gp  "GET /htdocs/inhalt.html HTTP/1.1" – hierbei handelt es sich um die eigentliche Anforderung des Clients, welche aus der HTTP-Methode GET, dem Anfrage-URI (/htdocs/inhalt.html) und der Version des HTTP-Protokolls (1.1) besteht.
gp  200 – der HTTP-Statuscode 200 sagt aus, dass alles in Ordnung war (404 würde etwa bedeuten, dass ein angefordertes Dokument nicht auf dem Rechner gefunden werden konnte).
gp  15081 – Anzahl der übertragenen Bytes (15081 Bytes)
gp  "http://www.irgendwoher.de/links.html" – wenn die URL nicht direkt eingegeben wurde, steht hier, von wo der Client gekommen ist.
gp  "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)" – Hierbei handelt es sich gewöhnlich um Informationen über die Umgebung des Benutzers, der auf die Seite gekommen ist. Der Wert ist nicht unbedingt zuverlässig und lässt sich ohne Probleme manipulieren bzw. ganz blockieren.

Um access_log nun auszuwerten, gilt es, einfach die einzelnen Werte, die man benötigt, aus den einzelnen Zeilen von access_log zu extrahieren und diese entsprechend auszuwerten. Das folgende Script demonstriert diesen Vorgang:

#!/bin/sh
# readaccess
# Diese Script analysiert die access_log-Datei des
# Apache Webservers mit interessanten Informationen
# mathematische Funktion (Wrapper für bc) ...
calc() {
bc -q << EOF
scale=2
$*
quit
EOF
}
# Damit verhindern Sie, dass bei der Auswertung der
# 'Referred Hits' der eigene Domainname berücksichtigt wird.
host="pronix.de"
# Anzahl der am meisten besuchten Seiten
POPULAR=10
# Anzahl der Referrer-Seiten
REFERRER=10
if [ $# -eq 0 ]
then
  echo "Usage: $0 logfile"
  exit 1
fi
# Logfile lesbar oder vorhanden ...
if [ -r "$1" ]
then :
else
  echo "Fehler: Kann Log-Datei '$1' nicht finden...!"
  exit 1
fi
# Erster Eintrag im Logfile ...
dateHead=`head –1 "$1" | awk '{print $4}' | sed 's/\[//'`
# Letzter Eintrag im Logfile ...
dateTail=`tail –1 "$1" | awk '{print $4}' | sed 's/\[//'`
echo "Ergebnis der Log-Datei '$1'"
echo
echo "  Start Datum : `echo $dateHead | sed 's/:/ um /'`"
echo "    End Datum : `echo $dateTail | sed 's/:/ um /'`"
# Anzahl Besucher, einfach mit wc zählen
hits=`wc -l < "$1" | sed 's/[^[:digit:]]//g'`
echo "        Hits  : $hits (Zugriffe insgesamt)"
# Seitenzugriffe ohne Dateien .txt; .gif; .jpg und .png
pages=`grep -ivE '(.txt|.gif|.jpg|.png)' "$1" | wc -l | \
       sed 's/[^[:digit:]]//g'`
echo "Seitenzugriffe: $pages (Zugriffe ohne Grafiken"\
     " (jpg, gif, png und txt)"
# Datentransfer – Traffic
totalbytes=`awk '{sum+=$10} END {print sum}' "$1"`
echo -n " Übertragen   : $totalbytes Bytes "
# Anzahl Bytes in einem GB = 1073741824
# Anzahl Bytes in einem MB = 1048576
if [ $totalbytes -gt 1073741824 ] ; then
   ret=`calc "$totalbytes / 1073741824"`
   echo "($ret GB)"
elif [ $totalbytes -gt 1048576 ] ; then
   ret=`calc "$totalbytes / 1048576"`
   echo "($ret MB)"
else
  echo
fi
# Interessante Statistiken
echo
echo "Die $POPULAR beliebtesten Seiten sind " \
     " (ohne gif, jpg, png, css, ico und js):"
awk '{print $7}' "$1" | \
  grep -ivE '(.gif|.jpg|.png|.css|.ico|.js)' | \
  sed 's/\/$//g' | sort | \
  uniq -c | sort -rn | head -$POPULAR
echo
echo "Woher kamen die Besucher ($REFERRER besten URLs'):"
awk '{print $11}' "$1" | \
  grep -vE "(^\"-\"$|/www.$host|/$host)" | \
  sort | uniq -c | sort -rn | head -$REFERRER

Das Script bei der Ausführung:

you@host > ./readaccess logs/www.pronix.de/access_log
Ergebnis der Log-Datei 'logs/www.pronix.de/access_log'
  Start Datum : 08/May/2005 um 04:47:45
    End Datum : 13/May/2005 um 07:13:27
        Hits  : 168334 (Zugriffe insgesamt)
Seitenzugriffe: 127803 (Zugriffe o. Grafiken (jpg, gif, png, txt)
Übertragen    : 1126397222 Bytes (1.04 GB)
Die 10 beliebtesten Seiten sind (ohne gif,jpg,png,css,ico,js):
   3498 /pronix-4.html
   1974 /pronix-6.html
   1677 /modules/newbb
   1154 /userinfo.php?uid=1
   1138 /userinfo.php?uid=102
   1137 /userinfo.php?uid=109
    991 /userinfo.php?uid=15
    924 /modules/news
    875 /userinfo.php?uid=643
Woher kamen die Besucher (10 besten URLs'):
     96 "http://homepages.rtlnet.de/algeyer001937/587.html"
     65 "http://www.computer-literatur.de/buecher/... "
     47 "http://www.linuxi.de/ebooksprogramm.html"
     37 "http://www.programmier-hilfe.de/index.php/C___C__/46/0/"
     35 "http://216.239.59.104/search?q=cache:kFL_ot8c2s0J:www...
     30 "http://www.tutorials.de/tutorials184964.html"
     27 "http://64.233.183.104/search?q=cache:EqX_ZN...
     25 "http://216.239.59.104/search?q=cache:KkL81cub2C...
     24 "http://216.239.59.104/search?q=cache:R0gWKuwrF...

Rheinwerk Computing

15.5.2 Analysieren von error_log (Apache)  toptop

In der Logdatei error_log finden Sie alle Fehler, die beim Aufrufen einer Seite oder eines Dokuments Ihrer URL aufgetreten sind. Die Zeile eines solchen Eintrags hat beim Apache folgende Form:

[Fri May 13 02:48:13 2005] [error] [client 66.185.100.10]
 File does not exist: /home/us10129/www.pronix.de/modules/
mylinks/modlink.php

Die Bedeutungen der einzelnen Einträge lassen sich schnell erklären:

gp  [Fri May 13 02:48:13 2005] – wann trat dieser Fehler auf?
gp  [error] – Hinweis, dass es sich auch um einen Fehler handelt. Möglich wäre hier auch notice.
gp  [client 66.185.100.10] – Benutzer bzw. Client, der den Fehler ausgelöst oder versucht hat, bei Ihnen rumzuhacken.
gp  File does not exist: – der eigentliche Fehler, der aufgetreten ist. Der gängigste Fehler: Die Datei wurde nicht gefunden.
gp  /home/us10129/www.pronix.de/modules/mylinks/modlink.php – die Datei, welche den Fehler ausgelöst hat.

Die Auswertung von error_log lässt sich etwas einfacher realisieren, da hierbei wesentlich weniger Daten als bei access_log geschrieben werden (sollten).

#!/bin/sh
# Name: readerrorlog
# Wertet error_log des Apaches aus
# Anzahl der Einträge, die pro Kategorie angezeigt werden sollen
MAXERRORS=10
# Sortierte Ausgabe von jeweils MAXERRORS pro Fehler
# ggf. sollte man eine Datei zum Zwischenspeichern,
# anstatt wie hier die Variable ret, verwenden ...
#
print_error_log() {
  ret=`grep "${2}" "$1" | awk '{print $NF}' |\
    sort | uniq -c | sort -rn | head -$MAXERRORS`
  if [ "$ret" != "" ] ; then
    echo
    echo "[$2] Fehler:"
    echo "$ret"
  fi
}
if [ $# -ne 1 ]
then
   echo "usage $0 error_log"
   exit 1
fi
# Anzahl der Einträge in error_log
echo "'$1' hat `wc -l < $1` Einträge"
# Erster Eintrag in error_log
dateHead=`grep -E '\[.*:.*:.*\]' "$1" | head –1 | \
          awk '{print $1" "$2" "$3" "$4" "$5}'`
# Letzter Eintrag in error_log
dateTail=`grep -E '\[.*:.*:.*\]' "$1" | tail –1 | \
          awk '{print $1" "$2" "$3" "$4" "$5}'`
echo "Einträge vom : $dateHead "
echo "bis zum      : $dateTail "
echo
# Wir geben einige Fehler sortiert nach Fehlern aus
# Die Liste kann beliebig nach Fehlern erweitert werden ...
#
print_error_log "$1" "File does not exist"
print_error_log "$1" "Invalid error redirection directive"
print_error_log "$1" "premature EOF"
print_error_log "$1" "script not found or unable to stat"
print_error_log "$1" "Premature end of script headers"
print_error_log "$1" "Directory index forbidden by rule"

Das Script bei der Ausführung:

you@host > ./readerrorlog logs/www.pronix.de/error_log
'logs/www.pronix.de/error_log' hat 2941 Einträge
Einträge vom : [Sun May 8 05:08:42 2005]
bis zum      : [Fri May 13 07:46:45 2005]
[File does not exist] Fehler:
     71 .../www.pronix.de/cmsimages/grafik/Grafik/bloodshed1.png
     69 .../www.pronix.de/cmsimages/grafik/Grafik/bloodshed2.png
     68 .../www.pronix.de/cmsimages/grafik/Grafik/bloodshed6.png
     68 .../www.pronix.de/cmsimages/grafik/Grafik/bloodshed5.png
     68 .../www.pronix.de/cmsimages/grafik/Grafik/bloodshed4.png
     68 .../www.pronix.de/cmsimages/grafik/Grafik/bloodshed3.png
     53 .../www.pronix.de/cmsimages/grafik/Grafik/borland5.gif
     53 .../www.pronix.de/cmsimages/grafik/Grafik/borland4.gif
     53 .../www.pronix.de/cmsimages/grafik/Grafik/borland3.gif
     53 .../www.pronix.de/cmsimages/grafik/Grafik/borland2.gif
[script not found or unable to stat] Fehler:
    750 /home/us10129/www.pronix.de/search.php
[Directory index forbidden by rule] Fehler:
    151 .../www.pronix.de/cmsimages/grafik/
     19 .../www.pronix.de/cmsimages/
     17 .../www.pronix.de/cmsimages/download/
     14 .../www.pronix.de/themes/young_leaves/
      3 .../www.pronix.de/css/
      1 .../www.pronix.de/cmsimages/linux/grafik/
      1 .../www.pronix.de/cmsimages/linux/
...
...


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern