15.5 World Wide Web und HTML
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.
15.5.1 Analysieren von access_log (Apache)
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:
|
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. |
|
- (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. |
|
- (zweiter Strich) – Login-Name des Benutzers, falls eine Passwort/Benutzername-Authentifizierung erforderlich ist. |
|
[13/May/2001:00:00:37 +0200] – Zeitstempel des Servers zum Zeitpunkt des Zugriffs, mit Datum, Uhrzeit und Zeitinformationen relativ zu GMT. |
|
"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. |
|
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). |
|
15081 – Anzahl der übertragenen Bytes (15081 Bytes) |
|
"http://www.irgendwoher.de/links.html" – wenn die URL nicht direkt eingegeben wurde, steht hier, von wo der Client gekommen ist. |
|
"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...
15.5.2 Analysieren von error_log (Apache)
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:
|
[Fri May 13 02:48:13 2005] – wann trat dieser Fehler auf? |
|
[error] – Hinweis, dass es sich auch um einen Fehler handelt. Möglich wäre hier auch notice. |
|
[client 66.185.100.10] – Benutzer bzw. Client, der den Fehler ausgelöst oder versucht hat, bei Ihnen rumzuhacken. |
|
File does not exist: – der eigentliche Fehler, der aufgetreten ist. Der gängigste Fehler: Die Datei wurde nicht gefunden. |
|
/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.
|