Navigationskarta Insitutitionen för Datavetenskap Umeå Universitet

Laboration 2: logg

Introduktion

Serverprocesser brukar spara information om sitt arbete i en loggfil. Loggfilerna är ett viktigt verktyg för systemadministratören. Man kan med hjälp av olika loggfiler se vilka som varit inloggade på maskinen, om det har varit några problem med skrivaren, hur många e-brev som skickats osv. I denna labb får du fördjupa dig i den loggfil som skapas av en webbserver.

Varje gång någon hämtar en sida från en webbserver sparas information om detta i webbserverns loggfil. Uppgifter som lagras är bland annat vilken sida som hämtats, IP-adressen för den dator användaren sitter på, vid vilken tidpunkt överföringen skedde osv. En rad i loggfilen kan se ut så här:

c131.dial-access.att.net - - [20/Aug/1999:08:51:41 +0200] "GET /index.html HTTP/1.0" 404 1992 "http://www.xyz.se/~gg/links.html" "Mozilla/4.05 [en] (X11; I; IRIX 6.3 IP32)"

Du kanske inte tycker att innebörden av ovanstående rad är omedelbart självklar, men oroa dig inte: det enda du behöver bry dig om på den här labben är den första delen av raden, som talar om från vilken IP-adress klienten kommer (i detta fall c131.dial-access.att.net). Några andra intressanta saker man kan se är att transaktionen gällde sidan /index.html, att den inträffade den 20 augusti kl 08:51 lokal tid och att klienten använde Netscape Navigator 4.05 ("Mozilla") under IRIX. Varje rad i loggfilen motsvarar överföring av ett objekt (en HTML-sida, en GIF-bild...) från servern. Detta kallas en "träff" på objektet. Exakt vilken information som finns i loggen och hur den lagras beror på vilken webbserver som används och hur den är konfigurerad. I den här labben används en loggfil från ACC.

Det huvudsakliga syftet med den här laborationen är att du ska få erfarenhet av minnes- och pekarhantering samt strängparsning i C. Det är lite mer invecklat än i exempelvis Java. Vidare måste du lista ut lite om hur loggfilen är uppbyggd. Att tolka utdata från andra program rätt är ett detektivarbete som ibland kan vara ganska invecklat, men en ofta återkommande arbetsuppgift för systemprogrammerare.

Din uppgift

Du ska skriva ett enkelt logganalysverktyg, som läser loggfilen och visar en sorterad lista över de 10 domäner som har flest träffar i loggfilen. Exempel:

% logg logfile
4583   se
2599   com
[...]
150    uk

Denna loggfil innehåller alltså 4583 träffar från domänen .se, 2599 från .com osv. Vidare ska det vara möjligt att få en mer detaljerad lista med fler delar av domännamnet. Detta anges med ett numeriskt argument >=1 före filnamnet:

% logg 3 logfile
976   sn.umu.se
477   ppp.algonet.se
[...]
165   242.48.91

Trean anger här att man ska titta på de tre sista delarna av domännamnet (eller rättare sagt högst tre; det kan ju hända att domännamnet bara innehåller två fält). Fälten avgränsas som bekant med punkter. Namnet på den loggfil som ska läsas ges alltid som sista argument till programmet. Syntaxen blir därmed:

logg [domain-depth] logfile

Tips

Till att börja med vill du säkert veta lite mer om formatet på loggfilen. Det är som sagt bara det första fältet du egentligen behöver bry dig om. Om du vill göra överkursuppgifterna behöver du studera ytterligare några fält.

Som vanligt är det viktigt att du arbetar på ett strukturerat sätt. Dela upp problemet i delproblem och lös ett problem åt gången, annars blir du gråhårig i förtid.

En intressant fråga är hur ditt program ska lagra statistiken för de olika domänerna. Det handlar ju om en sorts tabell:

Domän   Träffar
se     10
no     20
fi     30
...

Eftersom loggfilen kan vara hur stor som helst är det svårt att sätta någon övre gräns för tabellens storlek. Arrayer är alltså inte idealiska för denna tillämpning. Istället ska du använda en länkad lista (obs att detta är ett krav). Den som vill får gärna göra ett binärträd istället; det ger betydligt bättre prestanda för stora loggfiler. Tänk dock på att oavsett hur du väljer att lagra datat, så måste du avallokera minnesutrymmet för datat på ett kontrollerat sätt.

Några andra småsaker att tänka på:

Det finns exempel på körningar att titta på. Det är viktigt att du följer det utdataformatet. Anledningen till att vi vill ha det så är att vi använder ett automatiskt testprogram för att grovsålla bland de inlämnade labbarna, och om du inte har rätt utdataformat kommer din labb tyvärr att sållas bort (beklagar). Lita dock inte blint på ditt program så fort dess utdata överensstämmer med exemplet. Tänk även igenom din kod, och kolla att du tagit hand om alla specialfall som kan uppstå. Det kan vara så att ditt program råkar fungera för just den loggfil som testkörningarna gjordes på, men inte på en del andra loggfiler.

Du kan också titta på den loggfil som testkörningarna gjordes på (varning, den är ganska lång). Du kan kopiera den från /Home/special/www/public_html/kurser/TDBB40/HT99/lab/lab2/logg1.txt, eller spara filen från webbläsaren om du vet hur man gör det. Tips: Om du kör ditt program på samma loggfil med samma argument ska du förhoppningsvis få samma utdata.

Se till att ditt program så långt som möjligt är stabilt även om det träffar på oväntade indata. En del rader kanske inte har exakt det format de borde ha. I ett sådant läge kan du skriva ut ett felmeddelande på stderr och fortsätta med nästa rad. Vi vill inte se några systemfelmeddelanden av typen "Segmentation violation, core dumped", "Bus error" och liknande när vi rättar din labb. Några saker som är särskilt viktiga att komma ihåg är att strchr() och besläktade funktioner kan returnera NULL. Glöm aldrig att testa det. Kom också ihåg att en sträng kan vara kortare än du förväntar dig. Kom dessutom ihåg att testa returvärdet från alla systemanropsfunktioner (med enstaka undantag, exempelvis exit() och möjligtvis printf()).

Överkurs

Om du behöver något mer att bita i får du gärna implementera även följande statistik:

Om du implementerar överkursen, se noga till att den extra informationen bara visas om man ger särskilda kommandoradsargument. I annat fall kommer din lösning att få underkänt av rättningsskriptet.

Hårklyverier och besserwisser-upplysningar

Det här avsnittet är avsett för dig som tycker om att göra saker besvärligare än de egentligen behöver vara. Om du bara vill lösa labben behöver du inte läsa det.

Filer

Alla filer ska finnas i katalogen ~/edu/sysprog/lab2/ och vara läsbara för oss labrättare. De ska heta logg.c samt logg (samt eventuellt logg.h, list.c, samt list.h om du finner det motiverat att skapa fler filer). Din lösning ska gå att kompilera, köra och rätta utan att vi behöver kopiera några andra filer.

Sista inlämningsdag: Kl. 23:59 den 20 september 1999.

Inlämnat detta sista datum skall vara ett på Solaris-maskiner exekverbart logg-program, en välskriven laborationsrapport (i pappersformat) samt välkommenterad kod (tillsammans med labrapporten).

[an error occurred while processing this directive]