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.
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
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()
).
Om du behöver något mer att bita i får du gärna implementera även följande statistik:
q=
).
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.
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.
"GET
/~user/ HTTP/1.0"
refererar exempelvis sannolikt till
/~user/index.html
, men det är inte säkert.
Exakt vad den refererar till beror på hur servern är konfigurerad och
vilka filer som ligger i katalogen.
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.
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]