For å feilsøke og finne årsaken til en feil har man behov for informasjon om kontekst når situasjonen inntraff. Dette inkluderer overordnet informasjon som maskin, bruker, tidspunkt og opprinnelse i koden. I tillegg vil man gjerne ha spesifikk informasjon om tilstand og data som ble behandlet. Målet er å kunne gjenskape situasjonen i et utviklingsmiljø for å forstå og rette feilen.
Standard informasjon
Standard logginformasjon inkluderer typisk tidspunkt, alvorlighetsgrad, program- og komponentnavn i tillegg til selve meldingen. Et godt loggrammeverk tilbyr tilpasning av både innhold og format av disse parametrene.
Riktig feilhåndtering forutsetter fornuftig kategorisering og identifisering av feilhendelse. Feilkategori og unik feil-ID er en viktig del av kontekstinformasjonen.
Brukernavn
Brukernavn for den innloggede brukeren kan med fordel logges. Enkelte applikasjonsservere tilbyr denne funksjonaliteten forutsatt at du benytter de innebygde mekanismene for autentisering og logging. En teknikk man kan benytte i egen kode er å ha brukernavnet på trådkonteksten (for eksempel en ThreadLocal variabel i Java). Når en feil oppstår henter loggmekanismen brukernavnet fra trådkonteksten og skriver det til loggen. Mange sikkerhetsrammeverk bruker også denne teknikken, det kan derfor hende at brukernavnet allerede ligger klart for bruk.
Støtte for vilkårlig kontekstinformasjon
Når en feil oppstår er det gjerne nyttig å legge til spesifikk informasjon om tilstand og kontekst. Det kan også være behov for å supplere mer informasjon oppover i kall-stacken. Rammeverket bør derfor ha støtte for å legge til vilkårlig kontekstinformasjon, for eksempel som skissert under.
public class AbstractException() { ... public void leggTilFeilinformasjon(String navn, Object info) { feilinformasjon.add(navn, info); } }
Selvbeskrivende objekter
Når man skal logge tilstand for de ulike objektene er det en stor fordel at disse kan beskrive seg selv. Det er feil ansvarsfordeling dersom en feilhåndteringsrutine må pakke ut og formattere kontekstinformasjonen som skal logges. En slik tilnærming vil også sannsynligvis føre til inkonsistens og duplisering.
Java-mekanismen for selvbeskrivende objekter er den velkjente toString()-metoden. Ved å implementere toString() på en god måte vil tilstand kunne logges enkelt og konsistent. I tillegg er det enkelt å lage automatiserte tester for denne funksjonaliteten, og disse kan også fungere som dokumentasjon. Komponenter som Apache ToStringBuilder kan være nyttig for implementasjon av toString().
Stacktrace og uventede feil
God feilhåndtering betyr få stacktrace i loggen. Ideelt sett oppstår behovet for stacktrace kun ved programmeringsfeil; gitt at applikasjonsfeil og systemfeil er riktig håndtert og har tilstrekkelig kontekstinformasjon. Imidlertid, når en uventet feil først oppstår er stacktracen en uvurderlig del av kontekstinformasjonen. Man kan med forlel skille ut disse i en egen logg for utviklere; drift ser ofte på stacktrace som et verdiløst irritasjonsmoment.
Oppsummering
God kontekstinformasjon er en sentral mekanisme for riktig feilhåndtering. Drift og utvikling kan med stor sannsynlighet forstå og gjenskape feilsituasjonen, og dermed også rette feilen raskt. Teknikkene for kontekstinformasjon er enkle å implementere, forutsatt at feilhåndtering er en prioritert og forstått del av prosjektet.