Java >> Java tutorial >  >> Java

Logger vs. System.out.println

Se denne korte introduktion til log4j.

Problemet er at bruge System.out for at udskrive fejlfindings- eller diagnosticeringsoplysninger. Det er en dårlig praksis, fordi du ikke nemt kan ændre logniveauer, slå den fra, tilpasse den osv.

Men hvis du lovligt bruger System.out for at udskrive oplysninger til brugeren, så kan du ignorere denne advarsel.


Hvis du bruger System.out|err.println(..) til at udskrive brugeroplysninger på konsollen i din applikations main()-metode, gør du intet forkert. Du kan slippe af med beskeden ved at indsætte en kommentar "//NOPMD".

System.out.println("Fair use of System.out.println(..).");// NOPMD

Der er en "Markér som gennemgået"-mulighed i PMD-overtrædelsesoversigten til dette formål.

Selvfølgelig kan du snyde PMD med følgende kodestykke:

PrintStream out=System.out;
out.println("I am fooling PMD.");  

Uden for din hoved()-metode, brug et log-system som f.eks. Log4j.

OPDATERING:

Du kan også ændre PMD-reglen "SystemPrintln" til at bruge følgende XPath:

//MethodDeclaration[@MethodName!="main"]//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
] | //Initializer//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
]

Dette vil ignorere System.out.println osv. i enhver metode, der hedder 'main' i din kode, men tjek efter System.out.println i initializer-koden. Jeg kan godt lide dette, for fra mit synspunkt er System.out.println sikkert i metoden 'main(String args[])'. Men brug med forsigtighed, jeg er nødt til at tjekke, hvor i AST en System.out.println også kan forekomme og skal tilpasse XPath.


Dette link giver mere kortfattet information om, hvordan du bruger Log4j:Brug ikke System.out.println! Det har dog kun en lille fejl, du skal helst ikke sætte biblioteket i /jre/lib/ext , men kun i runtime classpath for din applikation og send den med.

Fordelen er, at du kan bruge logningsniveauer til at indikere vigtigheden af ​​informationerne, så du eksternt kan konfigurere, hvilke niveauer der skal vises/skjules i outputtet (så du ikke bliver irriteret over den - trods alt - ubrugelige information) , hvordan outputtet skal se ud (f.eks. inkludere et tidsstempel, tråd-id, klassenavn, metodenavn osv.), og hvor outputtet skal skrives til (f.eks. konsollen, en fil, en e-mail osv.) og i tilfælde af f.eks. filer også hvordan de skal oprettes (f.eks. grupper efter år, måned og/eller dag).

Der er flere loggerimplementeringer som Java SE's indbyggede java.util.logging.Logger , den bekvemme Apache Commons Logging, den populære Apache Log4j, dens efterfølger Logback osv. Du kan bruge Slf4j som et ekstra abstraktionslag til at skifte mellem enhver af disse loggere, når det er nødvendigt.


Java tag