Avancerad Java/ Loggning

Relevanta dokument
Att skriva till och läsa från terminalfönstret

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

DAT043 Objektorienterad Programmering

Föreläsnings 9 - Exceptions, I/O

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

JAVA Mer om klasser och objektorientering

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Kompilera och exekvera Javakod

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Klassen javax.swing.timer

Felhantering TDDD78, TDDE30, 729A

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen , Grundläggande programmering i Java

Chapter 4: Writing Classes/ Att skriva egna klasser.

Objekt, Klasser, Paket m. m.

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Testning av program. Verklig modell för programutveckling

Internationalisering/lokalisering på webben

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

PROV. 10 Uppräknade datatyper

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

Tentamen FYTA11 Javaprogrammering

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

1 Comparator & Comparable

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

4.4 Swing ett interaktivt grafiskt gränssnitt

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tentamen, EDAA10 Programmering i Java

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Installation xvis besökssystem, Koncern

Installationsbeskrivning för CAB Service Platform med CABInstall

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Felhantering 2017

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Här beskrivs Eclipse, den programutvecklingsmiljö som utnyttjas i programmeringskurserna. Mera information finns på:

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Språkkonventioner och redigering av tal.

Handbok. Procapita Vård och Omsorg Drifthandledning Gallring ver 9.2w

Att använda Java SE JDK 6

System.out.println("Jaså du har "+ antaldollar + " stycken.");

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

LEX INSTRUKTION LEX LDAP

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Så här byter du från Unifaun WebOrder (UWO) till Unifaun OnlineConnect (UOCT)

Grupp Policys. Elektronikcentrum i Svängsta Utbildning AB

Algoritmer. Två gränssnitt

Lösningar för tenta 2 DAT043,

DIG IN TO Administration av nätverk- och serverutrustning

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Handbok. Procapita Vård och Omsorg Drifthandledning Gallring ver

2 Eclipse en handledning

Versionshantering med Git

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Verktyg och Utvecklingsmiljö. Föreläsning 2 Eclipse

Föreläsning 14. Filhantering

Laboration 10 - Eclipse

Installation av Virtualiseringsplattform

Innehållsförteckning. 9 Större projekt Övningsuppgifter...32

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Obligatorisk uppgift: Numerisk kalkylator

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Fördjupad Java. Undantagshantering. Fel

Eclipse en handledning

Tentamen. DD2385 Programutvecklingsteknik vt 2011 Tisdagen den 24 maj 2011 kl Hjälpmedel: penna, suddgummi, linjal

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Tentamen , Introduktion till Java, dtaa98, dtea53

Obligatorisk uppgift: Numerisk kalkylator

NetBeans 5.5. Avsikt. Projektfönster

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

OOP Objekt-orienterad programmering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

När programmet är nyinstallerat finns endast en användare, SA (Systemadmininstratör), upplagd och denne har inte något lösenord.

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Kända avvikelser, BankID säkerhetsprogram för Windows Version 1.15, uppdaterad och gäller BISP Mac och BISP 6.3.

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

TENTAMEN. Objektorienterade applikationer CHALMERS. 2018/2019, lp 3 DAT055. Uno Holmer

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen, EDAA20/EDA501 Programmering

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

Transkript:

10 10.1 10.2 Att skapa loggmeddelanden 10.3 Fördefinierade loggningsnivåer 10.4 Klassen Logger tjänster 10.5 Konfiguration av loggning 10.7 Fördefinierade loggningshanterare

10.1 Fr o m Java 1.4 finns stöd i standardbiblioteket för loggning: Användbart för felrapportering, felsökning, spårning och driftövervakning Störst nytta i servermiljö och i program utan grafiska användargränssnitt Stödet finns i namnrymden java.util.logging Loggmeddelanden delas in i sju kategorier via loggningsnivåer Det går att konfigurera vilka kategorier som ska loggas kan ske till skärmen (kommandoskal) en fil en socket i nätverk Loggmeddelanden kan lämnas i olika format Ren text praktiskt för människor som ska läsa loggad information XML enklare för program som ska bearbeta loggad information kan konfigureras individuellt per program utan omkompilering Fr o m version 1.4 av Java innehåller standardbiblioteket ett ramverk för loggning, dvs en teknik för att på ett enhetligt sätt samla upp och tillhandahålla loggmeddelanden som Java-program genererar. kan ha många användningsområden: den kan bilda grunden i ett system för felrapportering, den kan användas för avlusning och spårning i samband med felsökning i program och den kan ge underlag för driftövervakning av program. Alla program kan använda sig av loggning, men nyttan är störst i serverprogram som ofta körs i obemannad och långvarig drift, samt överhuvudtaget i program som saknar grafiska gränssnitt och därför inte lätt kan presentera felmeddelanden i dialoger. Biblioteksstödet består av klasser och gränssnitt i namnrymden java.util.logging. Varje loggmeddelande knyts till en nivå som anger hur kritiskt meddelandet är. Standardbibliotekets ramverk för loggning arbetar med sju nivåer, ordnade i en skala från minst till mest kritiskt. en utförs med hjälp av meddelandesändningar i koden, varefter ramverket bearbetar de meddelanden som genererats. En central egenskap i ramverket är att det finns möjligheter att konfigurera hur loggningen ska gå till: Det går att välja vilka nivåer av meddelanden som ska loggas, så att endast meddelanden av minst en viss nivå tas med. Loggmeddelanden av lägre nivå kan därmed stanna kvar i källkoden för framtida behov, utan att de för den skull skapar floder av utskrifter. kan ske till olika media: till skärmen (som regel ett kommandoskal som programmet startas från), till en eller flera filer, eller till en socket över ett nätverk. Loggmeddelanden kan presenteras i ren text, vilket passar bra när människor ska läsa dem, eller i XML, vilket lämpar sig bättre om ett program ska bearbeta dem. en kan konfigureras individuellt per program, och kan ändras utan omkompilering av koden.

10.2 Avancerad Java/5.2 Att skapa loggmeddelanden import java.util.logging.*; Parser.java public class Parser { public static void main(string[] args) { Logger applogger = Logger.getLogger("se.bohel.tools.Parser"); if (args.length < 1) { applogger.severe("command-line file name missing"); System.exit(1); else { String filename = args[0]; try { processfile(filename); catch (IOException e) { applogger.log(level.severe, "I/O exception while processing file", e); System.exit(2); All loggning sker via ett loggningsobjekt. Det finns ett globalt loggningsobjekt som kan användas, men det är nästan lika enkelt att skapa ett specifikt per applikation, vilket öppnar möjligheter att skräddarsy hur loggningen ska fungera per applikation. Ett applikationsspecifikt loggningsobjekt får vi via klasstjänsten getlogger hos klassen Logger i namnrymden java.util.logging den namnrymd där alla klasser och gränssnitt i ramverket för loggning finns. Tjänsten getlogger ska ha ett argument, och det ska vara antingen en namnrymd eller ett fullständigt specificerat klassnamn (dvs med namnrymder) som är unikt för applikationen. Den första gången tjänsten getlogger anropas med ett visst namn, skapas ett nytt loggningsobjekt, men om samma argument används på nytt, returneras det redan befintliga objektet. I vårt fall använder vi det fullständigt specificerade klassnamnet: Logger applogger = Logger.getLogger("se.bohel.tools.Parser"); Den generella tjänsten för loggning av meddelanden hos loggningsobjektet är log. Det finns ett antal överlagrade versioner av log. I bildens nedre del utnyttjas en version med tre argument. Den passar bra för loggning av språkunderstödda fel. De tre argumenten är loggningsnivån, meddelandets text samt det felbeskrivande objektet. snivån beskriver hur allvarligt felet är. I vårt fall använder vi loggningsnivån Level.SEVERE (en klasskonstant från klassen Level i namnrymden java.util.logging) för att signalera ett allvarligt fel som avbrutit programmets exekvering. När vi enbart vill logga ett meddelande med en loggningsnivå och en text, kan vi använda oss av bekvämlighetstjänster som t ex severe, som loggar ett meddelande på nivån Level.SEVERE.

10.3 Fördefinierade loggningsnivåer snivå Level.SEVERE Level.WARNING Level.INFO Level.CONFIG Level.FINE Level.FINER Level.FINEST Innebörd Ett allvarligt fel som förhindrar normal exekvering; riktat till systemadministratörer eller användare Ett potentiellt problem som inte förhindrar normal exekvering; riktat till systemadministratörer eller användare Ett informationsmeddelande som inte rör ett fel; riktat till systemadministratörer eller användare Ett meddelande som beskriver systemets konfiguration (operativsystem, fönsterhanterare, databas, drivrutiner etc); riktat till systemadministratörer eller användare Ett meddelande för grovskalig spårning av exekvering; riktat till utvecklare Ett meddelande för mer detaljerad spårning av exekvering, t ex när programmet påbörjar resp avslutar en metod; riktat till utvecklare Ett meddelande för mycket detaljerad spårning; riktat till utvecklare Standardbibliotekets ramverk för loggning har sju fördefinierade loggningsnivåer. De fyra högsta nivåerna är för meddelanden som riktas till systemadministratörer och användare, och bör därför formuleras så att en icke-utvecklingskunnig person kan förstå dem: Nivån Level.SEVERE är den högsta (dvs mest allvarliga) nivån. Den används för allvarliga fel som förhindrar normal exekvering av programmet. Motsvarande bekvämlighetstjänst är severe. Nivån Level.WARNING används för att ge varningar om potentiella fel som inte förhindrar normal exekvering av programmet. Motsvarande bekvämlighetstjänst är warning. Nivån Level.INFO används för att lämna information om programmets exekvering som inte har att göra med fel. Motsvarande bekvämlighetstjänst är info. Nivån Level.CONFIG används för att lämna information om systemets konfiguration, t ex namn och version av operativsystem, databas, drivrutiner etc. Motsvarande bekvämlighetstjänst är config. De tre lägsta nivåerna är riktade till utvecklare, och används för spårning av exekveringen i ett program: Nivån Level.FINE används för grovskalig spårning, t ex resultat av större operationer, mindre fel som programmet själv kunde hantera, etc. Motsvarande bekvämlighetstjänst är fine. Nivån Level.FINER används för mer detaljerad spårning av ett programs exekvering, t ex meddelanden om när exekveringen av en metod inleds resp avslutas, eller när språkunderstödda fel genereras. Motsvarande bekvämlighetstjänst är finer. Nivån Level.FINEST är den lägsta nivån. Den används för mycket detaljerad spårning, t ex när en viss punkt inuti en metod nås. Motsvarande bekvämlighetstjänst är finest.

10.4 Avancerad Java/5.2 Klassen Logger tjänster Tjänst log(level, message) log(level, message, exc) severe(message) warning(message) info(message) config(message) fine(message) finer(message) finest(message) entering("class", "method") exiting("class", "method") throwing("class", "method", exc) Beskrivning Logga meddelandet message på nivån level Logga meddelandet message med felet exc på nivån level Logga meddelandet message på nivån SEVERE Logga meddelandet message på nivån WARNING Logga meddelandet message på nivån INFO Logga meddelandet message på nivån CONFIG Logga meddelandet message på nivån FINE Logga meddelandet message på nivån FINER Logga meddelandet message på nivån FINEST Logga meddelandet att exekveringen av metoden "method" i klassen "class" påbörjas Logga meddelandet att exekveringen av metoden "method" i klassen "class" avslutas Logga meddelandet att metoden "method" i klassen "class" avbrutits av felet exc Klassen Logger innehåller en stor uppsättning av tjänster som kan användas för att logga meddelanden: Den grundläggande loggningstjänsten är log, som loggar ett givet meddelande på en specificerad loggningsnivå. Det finns ett antal överlagrade varianter av tjänsten, där några har extra argument som t ex referensen till ett felobjekt som hänger samman med meddelandet. De motsvarande tjänsterna logp resp logrb ger möjligheter att manuellt påverka hur meddelandet loggar var i koden det genererats, resp hur det ska anpassas nationellt. Det finns ett antal tjänster med namn som severe, warning, info etc, som gör det lättare att logga ett enkelt meddelande på en viss loggningsnivå. Tjänsten entering gör det lätt att logga ett spårmeddelande på nivån Level.FINER om att exekveringen går in i en specifik metod. Tjänstens argument är klass- och metodnamn i form av textsträngar. Det finns överlagrade varianter som kan ta med tjänstens argument (ett eller flera) i meddelandet. Tjänsten exiting gör det lätt att logga ett spårmeddelande på nivån Level.FINER om att exekveringen lämnar en specifik metod. Tjänstens argument är klass- och metodnamn i form av textsträngar. Det finns en överlagrad variant som kan ta med tjänstens returvärde i meddelandet. Tjänsten throwing gör det lätt att logga ett spårmeddelande på nivån Level.FINER om att exekveringen av en metod är på väg att avbrytas genom att ett språkunderstött fel genereras. Tjänstens argument är klass- och metodnamn i form av textsträngar, samt en referens till felobjektet för det aktuella felet.

10.5 Konfiguration av loggning # Global properties. logging.properties # By default we only configure a ConsoleHandler, which will only # show messages at the INFO and above levels. handlers= java.util.logging.consolehandler # To also add the FileHandler, use the following line instead. #handlers= java.util.logging.filehandler, java.util.logging.consolehandler # Default global logging level..level= INFO # Handler specific properties. # Default file output is in user's home directory. java.util.logging.filehandler.pattern = %h/java%u.log java.util.logging.filehandler.limit = 50000 java.util.logging.filehandler.count = 1 java.util.logging.filehandler.formatter = java.util.logging.xmlformatter # Limit the messages that are printed on the console to INFO and above. java.util.logging.consolehandler.level = INFO java.util.logging.consolehandler.formatter = java.util.logging.simpleformatter Hur loggningen ska fungera kan konfigureras genom att ändra filen logging.properties, som from Java SE 9 finns i katalogen conf i Javas installationskatalog (t o m Java SE 8 i underkatalogen lib under katalogen jre). Standardutseendet på denna fil visas här i något förkortat skick. Loggmeddelanden kan i ramverket skickas till en eller flera loggningshanterare, som var och en kan avgöra om de vill hantera meddelandet och hur det ska ske. I den första sektionen av konfigurationsfilen sätts egenskapen handlers till en kommaseparerad lista av aktiva loggningshanterare. I vårt fall är endast en hanterare av klassen ConsoleHandler från namnrymden java.util.logging aktiv. Detta är den hanterare som skickar loggmeddelanden till streamobjektet System.err, vilket normalt innebär att de dyker upp i det kommandoskal som programmet startats från (såvida inte utskrifter till System.err dirigerats om, förstås). I en utkommenterad rad (kommentarer inleds med tecknet #) visas hur en loggningshanterare av klassen FileHandler (från samma namnrymd) kan läggas till. Med dess hjälp kan loggmeddelanden samlas till en eller flera textfiler. Därnäst beskrivs (som egenskapen.level) vilken som är den minsta loggningsnivå som ramverket bryr sig om att förmedla vidare för bearbetning i detta fall nivån Level.INFO. Loggmeddelanden av lägre nivå sållas bort på ett tidigt stadium och når aldrig loggningshanterarna. Det blir därför inte kostsamt att ha dessa meddelanden kvar i koden. Därefter konfigureras varje hanterare för sig. Vi kan bl a ange en egen gräns för vilka loggningsnivåer den bryr sig om. I exemplet visas hur (den icke aktiva) loggningshanteraren FileHandler konfigureras så att loggning sker i XML-format till en enda fil (dvs inte till en roterande uppsättning av filer) som inte får växa till mer än 50 000 teckens storlek, och som placeras i användarens hemkatalog och där garanteras få ett unikt namn av formen java0.log, java1.log, etc.

10.6 Avancerad Java/5.2 Avslutningsvis konfigureras den aktiva loggningshanteraren ConsoleHandler till att generera utskrifter i enkelt textformat för loggmeddelanden av minst nivån Level.INFO (vilket är onödigt, så länge det överensstämmer med den generella begränsningen). Om vi inte vill ändra den centrala konfigurationsfilen logging.properties, kan vi i stället skapa en egen konfigurationsfil som bara används när vi exekverar det här programmet. En sådan konfigurationsfil utformas på samma sätt som den centrala konfigurationsfilen och pekas ut av systemegenskapen java.util.logging.config.file när vi startar programmet: java -Djava.util.logging.config.file=BookLog.properties BookForm

10.7 Fördefinierade loggningshanterare shanterare ConsoleHandler FileHandler SocketHandler StreamHandler MemoryHandler Funktion Skickar loggmeddelanden för utskrift till System.err, dvs normalt till det kommandoskal programmet startats från Samlar loggmeddelanden i en eller flera textfiler, med möjlighet att välja antal och maximal storlek på dessa filer, så att äldre logginformation automatiskt raderas; lämplig att använda i obemannad drift Skickar loggmeddelanden till en socket i ett nätverk Gemensam överklass till de tre föregående, lämplig att utgå ifrån för den som vill bygga en egen implementation där loggmeddelanden riktas till ett streamobjekt Samlar loggmeddelanden i en minnesbuffert som ständigt innehåller de senaste meddelandena (normalt 1000 stycken); skickar dem vidare till en annan hanterare först när ett meddelande av en miniminivå (normalt SEVERE) uppträder Standardbibliotekets ramverk för loggning innehåller fem fördefinierade loggningshanterare: Hanteraren ConsoleHandler är den enda som är aktiv i en standardkonfiguration. Loggmeddelanden av en viss miniminivå (antingen den generella, eller en mer begränsande nivå specifikt satt för denna hanterare) skickas till System.err för utskrift, normalt i enkelt textformat. Hanteraren FileHandler är den normala att använda i obemannad drift. Här samlas loggmeddelanden i en grupp av en eller flera textfiler. Via konfigurationsfilen går det att bestämma om en eller flera filer (där den äldsta hela tiden ersätts enligt ett roterande mönster) ska användas, hur stora filerna får bli, var de ska placeras i filsystemet och hur de ska namnsättas. Hanteraren klarar att ge unika namn till loggfiler, t o m i en fleranvändarmiljö med gemensamt filsystem. Meddelanden förmedlas normalt i XML-format. Hanteraren SocketHandler skickar loggmeddelanden till en socket i ett nätverk, specificerad via servernamn eller IP-nummer samt portnummer. Meddelanden förmedlas normalt i XML-format. StreamHandler är den gemensamma överklassen till de tre förstnämnda hanterarna. Den kan användas som utgångspunkt för konstruktion av skräddarsydda hanterare där loggmeddelanden riktas till någon typ av streamobjekt, i antingen enkelt textformat eller XML-format. Hanteraren MemoryHandler bevarar en rullande uppsättning av de senaste (normalt 1000) loggmeddelandena som mottagits, utan efterbearbetning som formatering eller liknande. Endast om ett loggmeddelande av minst en viss triggernivå (normalt nivån Level.SEVERE) tas emot, skickas hela uppsättningen av meddelanden vidare till en annan hanterare. Denna hanterare kan alltså användas för att exempelvis bevara de 1000 senaste mer detaljerade loggmeddelandena (t ex spårmeddelanden) som togs emot innan ett kritiskt fel inträffade.