Testen met Apache #3 – Logformaat

De websites die overgezet moesten worden werken inmiddels. Met behulp van zeven virtual hosts kunnen ze straks ook onder Apache bereikt worden.
Een aantal redirect-bestanden is omgezet naar .htaccess redirects en een aantal default.asp-bestanden die wél inhoud hadden zijn omgezet naar index.php bestanden.
Waar ik nu nog mee zit is het logformaat voor de verschillende logbestanden. Het liefste zou ik hetzelfde formaat aanhouden als dat ik in IIS had, maar dat blijkt niet te kunnen. Helaas. Uit de alternatieven kan ik nog niet goed kiezen.
Voor de sites in IIS heb ik al redelijk wat logbestanden, het voordeel van een eigen server, daar kun je zelf bepalen wat er in moet en is ruimte meestal geen probleem.

Logging in IIS
In IIS had ik bijna alle logopties aan staan:
#Fields: date time c-ip cs-username s-sitename s-computername s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status sc-win32-status sc-bytes cs-bytes time-taken cs-version cs-host cs(User-Agent) cs(Cookie) cs(Referer)
één regel in een logbestand ziet er dan bijvoorbeeld zo uit:
2004-09-25 00:00:04 207.46.98.112 – W3SVC4 ENTERPRISE 192.168.0.23 80 GET /pierre/files/SCORM+27+januari+2004.ppt – 200 64 65786 245 2243 HTTP/1.0 www.gorissen.info msnbot/0.3+(+http://search.msn.com/msnbot.htm) – –
De velden worden gescheiden door een spatie en daarom worden spaties binnen de velden automatisch vervangen door een +.

Logging in Apache
In Apache heb je niet één, maar een aantal logformaten per website. Een veel gebruikt, uitgebreid formaat is combined, die regels oplevert als:
192.168.0.27 – – [02/Jan/2005:16:49:34 +0100] “GET /Pierre HTTP/1.1” 301 251 “http://www.gorissen.info:81/” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0”
Verschil is dat spaties niet vervangen worden door een + en er zijn verschillende scheidingtekens naast de spatie in gebruik. Zo staat de datum tussen [] en bijvoorbeeld de browser tussen .

Apache laten loggen als IIS
Op zich is het mogelijk om dezelfde informatie als in IIS ook door Apache in één logbestand te laten opslaan.
Omdat de spatie niet als scheidingsteken bruikbaar is (andere spaties worden namelijk niet vervangen door +) heb ik er voor gekozen om de komma (,) en als generieke scheidingsmiddelen te gebruiken.
Dit: LogFormat “\”%{%Y-%m-%d}t\”,\”%{%T}t\”,\”%h\”,\”%u\”,
\”W3SVC4\”,\”%v\”,\”%A\”,\”%p\”,\”%m\”,\”%U\”, \”%q\”,\”%
>s\”,\”-\”,\”-\”,\”%B\”,\”%T\”,\”%v\”,
\”%{User-Agent}i\”,\”%{Set-Cookie}o\”,\”%{Referer}i\
IISlog

(als één regel)
zorgt er dan voor dat je dit in je logbestand krijgt:
“2005-01-02″,”15:11:57″,”192.168.0.27″,”879369”,
“W3SVC4″,”www.gorissen.info”,”192.168.0.23″,”81″,”GET”,
“/nucleus/xml-rss.php”,,”200″,”-“,”-“,”4122”,
“2”,”www.gorissen.info”,”Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0″,”user=Pierre; expires=Tue, 01-Feb-2005 14:11:56 GMT; path=/”,”-“

Probleem is dat er waarschijnlijk veel rapportagetools zijn die hier niet mee overweg kunnen. Maar ik wil het zaakje sowieso in MySql importeren voor verder gebruik. Dus eigenlijk zou het niets uit hoeven te maken. Toch?
Mijn vraag: zijn er overtuigende redenen om niet af te wijken van het combined format?

Roteren van logs
Minder problematisch bleek overigens het er voor zorgen dat Apache elke dag een nieuw logbestand begint. Iets wat ik ook gewend was van IIS.
Het toevoegen van:
CustomLog “|X:/Apache/bin/rotatelogs logs/gorissen.info/IISlog-access% y% m% d.log 86400” IISlog
aan een virtual host zorgt er voor dat de naam van de bestanden dit formaat krijgen: IISlog-access050102.log
Elke dag wordt er een nieuwe bestand gestart (mits er iets in op te slaan is).

Andere logbestanden
Op zich wel mooi is dat het relatief eenvoudig is om andere informatie in aparte logbestanden op te slaan.
De combinatie van:
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
LogFormat “%{cookie}n %r %t” cookie

met:
CustomLog logs/gorissen.info/cookie.log cookie
CustomLog logs/gorissen.info/referer.log referer
CustomLog logs/gorissen.info/agent.log agent

in httpd.conf zorgt ervoor dat cookies, referers en informatie over de gebruikte browsers in aparte logbestanden wordt opgeslagen. De voorgestelde formaten zijn overigens een beetje vreemd. Zo is de -> tussen de referer en de pagina waarnaar verwezen wordt wel raar en met alleen de user-agent (‘browser’), dus zonder bijvoorbeeld ip-nummer van bezoeker en datum weet je nog niet veel.

Interessante opties
Interessant wordt het overigens bij de wat complexere zaken, zoals:
SetEnvIf Request_URI (xml-rss*.php) rss-request
CustomLog logs/gorissen.info/rss.log common env=rss-request

(bij nucleus heten de RSS-bestanden standaard resp. xml-rss.php en xml-rss2.php)
Met die twee regels maak je een apart logbestand (rss.log) aan waarin alleen de verzoeken voor de RSS-pagina’s worden bijgehouden.
Dat is informatie die je natuurlijk ook uit het algemene logbestand kunt filteren, maar zo heb je ze handig in een apart bestand. Toch?

Je zou er overigens voor kunnen kiezen om de informatie die je in de aparte logbestanden opslaat, niet in het ‘algemene’ logbestand op te slaan, dus daar bijvoorbeeld voor het common-formaat te kiezen.

Mijn vraag: weegt het voordeel van het opsplitsen van de loginformatie over verschillende bestanden wel op tegen de mogelijke problemen van het weer samen zien te voegen van de informatie? Bij het commom-formaat wordt bijvoorbeeld de informatie over cookies niet opgeslagen. Als je die informatie wilt koppelen, moet je meerdere bestanden gaan verwerken.