...
Logging gjøres ved å bruke ulike implementasjoner av ILogger, som er definert som følger:
...
- severity-argumentet angir alvorlighetsgraden, og må være en av String-verdiene ERROR, WARNING eller INFO, som er definert som konstanter i grensesnittet.
- message-argumentet er en melding om hva som var feil.
- exception-argumentet er et unntaksobjekt, som kan gi mer informasjon av hva som var feil, eller men kan være null.
En typisk bruk vil være i catch-delen av en try/catch:
Code Block |
---|
ILogger logger = ... ... try { ... } catch (IOException ioe) { logger.log(ILogger.ERROR, "Feil ved lesing fra fil", ioe); } |
Akkurat hvordan logging utføres bestemmer bestemmes av hvilken implementasjon av ILogger-grensesnittet en bruker, og i denne oppgaven skal du implementere følgende tre klasser:
...
Disse utgjør hver som deloppgave og beskrevet under.
Exercise-panelet
Bruk av Exercise-panelet er obligatorisk for denne øvingen. Du må ha panelet åpent med Logger.ex-filen (tests > patterns.delegation > Logger.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på forrige side, altså hovedsiden for Øving 8.
Del 1 - StreamLogger
En StreamLogger sørger for å skrive alle logg-meldinger til en angitt OutputStream (se Forelesningslysark om input/output (IO), med kode-eksempel), med én melding pr. linje (altså linjeskift mellom hver melding). OutputStream-objektet må gis inn i konstruktøren:
...
Code Block |
---|
ILogger logger = new StreamLogger(System.out); logger.log(ILogger.INFO, "Denne meldingermeldingen er til informasjon og skrives til System.out", null); |
...
- setFormatString(String formatString) - setter format-Stringstring-en som brukes for å lage logg-meldingen som skrives
...
Code Block |
---|
String logMessage = String.format(formatString, severity, message, exception); // skriv logMessage til OutputStream-en her |
Merk at dersom format-string-en ikke er satt, så skal den ha en fornuftig start-verdi.
Testkode for oppgaven: patterns/delegation/StreamLoggerTest.java. Originalkoden for testen (jextest) kan du finne her: patterns/delegation/StreamLogger.jextest
Del 2 - FilteringLogger
FilteringLogger-klassen implementerer ILogger-grensesnittet og delegerer til en annen ILogger-implementasjon, men bare hvis alvorlighetsgraden er en av et sett angitte verdier. Både loggeren det delegeres til og alvorlighetsgradene angis når FilteringLogger-objektet opprettes:
...
Det skal også være mulig å sjekke om logging er på og slå logging av og på i etterkant:
- boolean isLogging(String severity) - returnerer true hvis logging er slått på for den angitte alvorlighetsgraden og false ellers.
- void setIsLogging(String severity, boolean value) - slår logging på (value = true) eller av (value = false) for den angitte alvorlighetsgraden
Eksempel på bruk:
Code Block |
---|
ILogger syserrLogger = new StreamLogger(System.err); FilteringLogger logger = new FilteringLogger(syserrLogger, ILogger.ERROR); logger.log(ILogger.ERROR, "Denne meldingermeldingen er alvorlig og skrives til System.err", null); logger.log(ILogger.WARNING, "Denne meldingermeldingen er en advarsel og blir filtrert bort", null); logger.log(ILogger.INFO, "Denne meldingermeldingen er til informasjon og blir filtrert bort", null); logger.setIsLogging(ILogger.WARNING, true); logger.log(ILogger.WARNING, "Denne meldingermeldingen er en advarsel og blir nå skrevet til System.err", null); |
Testkode for oppgaven: patterns/delegation/FilteringLoggerTest.java. Originalkoden for testen (jextest) kan du finne her: patterns/delegation/FilteringLogger.jextest.
Del 3 - DistributingLogger
...
I tillegg skal klassen ha en metode for å sette hver av dem individuelt:
- void setLogger(String severity, ILogger logger) - setter/endrer loggeren som brukes for den angitt angitte alvorlighetsgraden.
Eksempel på bruk:
Code Block |
---|
ILogger syserrLogger = new StreamLogger(System.err); ILogger sysoutLogger = new StreamLogger(System.out); DistributingLogger logger = new DistributingLogger(syserrLogger, syserrLogger, sysoutLogger); logger.log(ILogger.ERROR, "Denne meldingermeldingen er alvorlig og skrives til System.err", null); logger.log(ILogger.WARNING, "Denne meldingermeldingen er en advarsel og skrives til System.err", null); logger.log(ILogger.INFO, "Denne meldingermeldingen er til informasjon og skrives til System.out", null); logger.setLogger(ILogger.WARNING, sysoutLogger); logger.log(ILogger.ERRORWARNING, "Denne meldingermeldingen er en advarsel, men nå skrives den til System.out", null); |
Testkode for oppgaven: patterns/delegation/DistributingLoggerTest.java. Originalkoden for testen (jextest) kan du finne her: patterns/delegation/DistributingLogger.jextest.
Include Page | ||||
---|---|---|---|---|
|