Öfter wird in den Newsgroups gefragt, wie man den die Zugriffe auf die Website auswerten kann. Nun dafür gibt es Tools wie den Siteserver von MS oder Analog als Freeware. Beide sind etwas rau zu bedienen, weil Sie schlicht zu universell sind. Bisher haben wir als getreue MS Diener den Siteserver 3.0 verwendet. Über unser Produkt IntraNaut sind wir aber jetzt von Kunden gefragt worden, wie kann der Zugriff auf einzelne Artikel aufgezeichnet werden. Der erste Gedanke war, na ganz einfach mit einer Tabelle im SQL Server und per "Insert Into" usw.
Der erste Gedanke ist aber auch manchmal nicht der beste. In Kombination der hier bereits erwähnten Tatsachen ist es besser auf die bereits vorhandenen Dinge zurückzugreifen- die Logfiles. Jeder Webserver hat sie.
Logfiles Kickoff( für Profis zum überspringen)
Die Zugriffe auf den Webserver werden detailliert in den Logfiles vom IIS aufgezeichnet. Man kann dies zwar ausschalten, sollte es aber nicht. Die Speicherung ist sehr effektiv und schlägt jede ASP ODBC Zugriffsspeicherung um Performance Dimensionen. Die Information die aufgezeichnet werden soll, kann im IIS Admin (Website-Protokollierung-Eigenschaften-erweiterte Eigenschaften) detailliert festgelegt werden.
Darin findet man alles was man braucht wie die IP oder Referer Adress. Wenn das nicht reichen sollte, kann man über die IP noch Verknüpfungen zu Metainformationen machen. Aber dazu später mehr. Jeder Webserver (auch virtuelle) erzeugt sein eigenes Log Verzeichnis. Diese finden sich in der Regel unter
WINNT/SYSTEM32/logfiles.
Diese Logfiles enthalten Zeilen wie diese
2001-01-16 08:27:12 127.0.0.1 GET /aspbuch/genExcel.asp 200 0 |
Hier ist das Datum, die Uhrzeit, die IP des Requesters, das HTTP Kommando, der Request und der HTTP Status aufgezeichnet.
Logfiles Kickoff END
Entsprechen dem gewählten Format der Logfiles wird im nächsten Schritt eine Access Tabelle mit dem Namen Import1 angelegt.
[import1] Datum Datetime IP Text(15) cmd Text(50) request Text(255) Status Text(10) Query Text(255) |
Der Vorteil von einem Datenbanksystem ist, das man sehr einfach mit SQL Statements Auswertungen vornehmen kann. Dies beschreibe ich im 2ten Teil dieses Artikels. Nun aber zur Aufgabe: bringe die Log Dateien in die Tabelle. Dazu bemühen wir das Filesystem Objekt.
Da ist auch schon alles drin was wir brauchen.
Ich könnte eine VBS Datei schreiben oder auch ein ASP Seite. Hier zeige ich den Code mit ASP.
Zunächst holen wir alle Files im Folder mit Getfolder.
Dann wird durch die Auflistung abgearbeitet. Damit auch ganz sicher nur Log Files importiert werden, wird auf die Extension .LOG geprüft.
Dann wird Zeile für Zeile aus der Log Datei eingelesen. Per Split wird die Zeile in ein Array geschrieben. Als Trenner müss das Leerzeichen herhalten( Siehe Log Eintrag oben) Da in Logfiles auch der Start des IIS geschrieben wird und dies eine abweichende Info ist, prüfen wir noch ab ob die erste Spalte auch wirklich ein Datum ist.
Der Eigentliche Import passiert dann per "Insert Into" SQL Statement:
<% set con=server.CreateObject("ADODB.Connection") con.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:WINNTsystem32LogFilesimport.mdb;") pfad="e:winntsystem32logfilesw3svc1" Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(pfad) Set objFiles = objFolder.Files on error resume next For Each objFile in objFiles strFile = pfad & Lcase(objFile.Name) if instr(objfile.name,".log")>0 then set stream = objFSO.OpentextFile(strfile) do while stream.AtEndOfStream=false kette=stream.readline arr=split(kette," ") if isdate(arr(0)) then sql="insert into import1 values ('" & cdate(arr(0)) & " " & arr(1)& "','" & arr(2)& "','" & arr(3)& "','" & arr(4) & "','"& arr(5) & "','"& arr(6) & "')" con.Execute sql end if loop end if next %> |
Diese Seite muss über den Browser aufgerufen werden. Wenn Sie 2 x gestartet wird, passiert der Import auch doppelt. Lösungsansätze liegen in der Datenbank Integrität oder man benennt das Logfile nach dem Import einfach um.
In der Praxis lässt man so einen Import zu einer Zeit laufen, wo der Webserver wenig zu tun hat. Da dies meist nachts ist, wäre eine Zeitgesteuerte Ausführung von Vorteil. Auch dazu gibt's hier einige Beiträge.
Im nächsten Artikel zeigen wir, was mit den so gewonnen Daten passiert.