System.out.println versus loggers

1. Waarom houthakkers?

Gebruik tijdens het schrijven van een programma of het ontwikkelen van een bedrijfsproductie-applicatie System.out.println lijkt de eenvoudigste en gemakkelijkste optie te zijn. Er hoeven geen extra bibliotheken aan het klassenpad te worden toegevoegd en er hoeven geen aanvullende configuraties te worden gemaakt.

Maar met System.out.println heeft verschillende nadelen die de bruikbaarheid in veel situaties beïnvloeden. In deze tutorial bespreken we waarom en wanneer we een logger zouden willen gebruiken in plaats van gewoon oud System.out en System.err. We zullen ook enkele snelle voorbeelden laten zien met behulp van het Log4J2-logboekregistratieframework.

2. Installatie

Laten we, voordat we beginnen, eens kijken naar de vereiste Maven-afhankelijkheden en configuraties.

2.1. Afhankelijkheden van Maven

Laten we beginnen met het toevoegen van de Log4J2-afhankelijkheid aan onze pom.xml:

 org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1 

We kunnen de nieuwste versies van log4j-api en log4j-core op Maven Central.

2.2. Log4J2-configuratie

Het gebruik van System.out vereist geen extra configuratie. Om Log4J2 te gebruiken, hebben we een log4j.xml configuratiebestand:

Bijna alle logger-frameworks vereisen een bepaald configuratieniveau, hetzij programmatisch, hetzij via een extern configuratiebestand, zoals het XML-bestand dat hier wordt getoond.

3. Scheiden van logboekuitvoer

3.1. System.out en System.err

Wanneer we onze applicatie implementeren op een server als Tomcat, gebruikt de server zijn eigen logger. Als we System.out, de logboeken komen terecht in catalina.uit. Het is veel gemakkelijker om onze applicatie te debuggen als logboeken in een apart bestand worden geplaatst. Met Log4j2 moeten we een bestandsappender in de configuratie opnemen om applicatielogboeken in een apart bestand op te slaan.

Ook met System.out.println, er is geen controle of filtering van welke logboeken moeten worden afgedrukt. De enige mogelijke manier om de logboeken te scheiden, is door te gebruiken System.out.println voor informatielogboeken en System.err.println voor foutenlogboeken:

System.out.println ("Dit is een informatief bericht"); System.err.println ("Dit is een foutmelding");

3.2. Log4J2 Logging-niveaus

In debug- of ontwikkelomgevingen willen we alle informatie zien die de applicatie afdrukt. Maar in een live bedrijfstoepassing betekent meer logboeken een toename van de latentie. Logger-frameworks zoals Log4J2 bieden besturingselementen op meerdere logniveaus:

  • FATAAL
  • FOUT
  • WAARSCHUWEN
  • INFO
  • DEBUG
  • SPOOR
  • ALLE

Met behulp van deze niveaus, we kunnen gemakkelijk filteren wanneer en waar we welke informatie willen afdrukken:

logger.trace ("Traceringslogbericht"); logger.debug ("Foutopsporingslogboekbericht"); logger.info ("Info logbericht"); logger.error ("Foutenlogboekbericht"); logger.warn ("Waarschuw logbericht"); logger.fatal ("Fataal logbericht");

We kunnen ook de niveaus voor elk broncodepakket afzonderlijk configureren. Raadpleeg ons artikel over Java-logboekregistratie voor meer informatie over de configuratie op logniveau.

4. Logboeken naar bestanden schrijven

4.1. Herroutering System.out en System.err

Het is mogelijk om te routeren System.out.println naar een bestand met de System.setOut () methode:

PrintStream outStream = nieuwe PrintStream (nieuw bestand ("outFile.txt")); System.setOut (outStream); System.out.println ("Dit is een baeldung-artikel");

En in het geval van System.err:

PrintStream errStream = nieuwe PrintStream (nieuw bestand ("errFile.txt")); System.setErr (errStream); System.err.println ("Dit is een baeldungartikelfout");

Bij het omleiden van de uitvoer naar een bestand met System.out of System.err, we hebben geen controle over de bestandsgrootte, dus het bestand blijft groeien tijdens de uitvoering van de applicatie.

Naarmate de bestandsgrootte toeneemt, kan het moeilijk zijn om deze grotere logboeken te openen of te analyseren.

4.2. Inloggen naar bestanden met Log4J2

Log4J2 biedt een mechanisme om systematisch logboeken in bestanden te schrijven en de bestanden ook te rollen op basis van bepaald beleid. We kunnen bijvoorbeeld configureer de bestanden die moeten worden doorgerold op basis van een datum- / tijdpatroon:

Of we kunnen rol de bestanden op basis van grootte zodra ze een bepaalde drempel hebben bereikt:

...% d {jjjj-MM-dd UU: mm: ss}% p% m% n 

5. Inloggen op externe systemen

Zoals we in de vorige sectie hebben gezien, maken logger-frameworks het mogelijk om de logboeken naar een bestand te schrijven. Evenzo bieden ze ook appenders om logboeken naar andere systemen en applicaties te sturen. Dit maakt het mogelijk om logboeken naar een Kafka Stream of een Elasticsearch-database te sturen met Log4J-appenders in plaats van System.out.println.

Raadpleeg ons Log4j-appender-artikel voor meer informatie over het gebruik van dergelijke appenders.

6. Logboekuitvoer aanpassen

Met behulp van Loggers kunnen we aanpassen welke informatie moet worden afgedrukt, samen met het daadwerkelijke bericht. De informatie die we kunnen afdrukken, omvat de pakketnaam, het logniveau, het regelnummer, het tijdstempel, de naam van de methode, enz.

Terwijl dit mogelijk zou zijn met System.out.println, het zou veel handmatig werk vergen, terwijl logging-frameworks deze functionaliteit out-of-the-box bieden. Met loggers, we kunnen eenvoudig een patroon definiëren in de logger-configuratie:

Als we Log4J2 beschouwen als ons logger-framework, zijn er verschillende patronen waaruit we kunnen kiezen of die we kunnen aanpassen. Raadpleeg de officiële Log4J2-documentatie voor meer informatie.

7. Conclusie

In dit artikel worden verschillende redenen uitgelegd waarom u een logger-framework gebruikt en waarom u er niet alleen op vertrouwt System.out.println voor onze toepassingslogboeken. Hoewel het gerechtvaardigd is om te gebruiken System.out.println voor kleine testprogramma's gebruiken we het liever niet als onze belangrijkste bron van logboekregistratie voor een productietoepassing voor bedrijven.

Zoals altijd zijn de codevoorbeelden in het artikel beschikbaar op GitHub.