CodeGym /Java blog /Tilfældig /Java logning
John Squirrels
Niveau
San Francisco

Java logning

Udgivet i gruppen
Hej! Når jeg skriver lektionerne, lægger jeg særligt vægt på, om der er et specifikt emne, som vil være helt essentielt i virkeligt arbejde. Så LYT OP! Det emne, vi vil dække i dag, vil helt sikkert komme til nytte i alle dine projekter fra dag ét af ansættelsen. Vi skal tale om Java-logging. Dette emne er slet ikke kompliceret (jeg vil endda sige let). Men du vil have nok indlysende ting at stresse over på dit første job, så det er bedre at forstå det grundigt lige nu :) Nå, lad os begynde.

Hvad er at logge på Java?

Logning er handlingen med at registrere data om driften af ​​et program. Stedet, hvor vi registrerer disse data, kaldes en "log". To spørgsmål melder sig straks: Hvilke data er skrevet og hvor? Lad os starte med "hvor". Du kan skrive data om et programs arbejde mange forskellige steder. I løbet af dit studie har du f.eks. ofte System.out.println()at udsende data til konsollen. Dette er faktisk logning, omend i sin enkleste form. Selvfølgelig er dette ikke særlig bekvemt for brugere eller et produktsupportteam: selvfølgelig vil de ikke installere en IDE og overvåge konsollen :) Der er et mere almindeligt format til registrering af information: tekstfiler. Mennesker er meget mere komfortable med at læse data i dette format, og det er bestemt meget mere bekvemt at gemme data! Nu det andet spørgsmål: hvilke programdata skal logges? Det er helt op til dig! Javas logningssystem er meget fleksibelt. Du kan konfigurere den til at logge alt, hvad dit program gør. På den ene side er dette godt. Men forestil dig på den anden side, hvor store Facebooks eller Twitters logfiler ville være, hvis de skrev alt i dem. Disse store virksomheder har sandsynligvis evnen til at gemme så meget data. Men forestil dig, hvor svært det ville være at finde information om en kritisk fejl i 500 gigabyte tekstlogfiler? Det ville være værre end at lede efter en nål i en høstak. Derfor kan Java konfigureres til kun at logge fejldata. Eller endda bare kritiske fejl! Når det er sagt, er det ikke helt præcist at tale om Javas native logning-system. Faktum er, at programmører havde brug for logning, før denne funktionalitet blev tilføjet til sproget. Da Java introducerede sit eget logbibliotek, brugte alle allerede log4j-biblioteket. Historien om at logge på Java er faktisk meget lang og informativ. Kort sagt, Java har sit eget logbibliotek, men næsten ingen bruger det :) Senere, da flere forskellige logbiblioteker dukkede op og begyndte at blive brugt af programmører, opstod der kompatibilitetsproblemer. For at forhindre folk i at genopfinde hjulet i et dusin forskellige biblioteker med forskellige grænseflader, blev den abstrakte SLF4J-ramme ("Service Logging Facade For Java") skabt. Det kaldes abstrakt, for selvom du bruger og kalder metoderne i SLF4J-klasser, så bruger de faktisk alle de log-frameworks, der kom før: log4j, standarden java.util.logging og andre. Hvis du på et tidspunkt har brug for nogle specifikke funktioner i Log4j, der mangler i andre biblioteker, men du ikke ønsker at linke dit projekt direkte til dette bibliotek, så brug bare SLF4J. Og lad det så kalde Log4j-metoderne. Hvis du ombestemmer dig og beslutter, at du ikke længere har brug for Log4j-funktioner, behøver du kun at omkonfigurere "her , og Log4j biblioteket her . Udpak derefter arkivet og brug IntelliJ IDEA til at tilføje JAR-filerne til klassestien. Menupunkter: Filer -> Projektstruktur -> Biblioteker Vælg de nødvendige JAR-filer og tilføj dem til projektet (arkiverne, vi downloadede, indeholder mange JAR-filer — se på billederne for at se dem, du har brug for) Bemærk, at denne instruktion for de Hvorfor har vi brug for logning - 2Hvorfor har vi brug for logning - 3studerende som ikke ved, hvordan man bruger Maven. Hvis du ved, hvordan du bruger Maven, er det normalt bedre (meget nemmere) at prøve at starte der. Hvis du bruger Maven , skal du tilføje denne afhængighed:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Store! Vi fandt ud af indstillingerne :) Lad os se, hvordan SLF4J fungerer. Hvordan sikrer vi os, at programmets arbejde bliver optaget et sted? For at gøre dette har vi brug for to ting: logger og appender. Lad os starte med den første. En logger er et objekt, der giver fuld kontrol over logningen. Det er meget nemt at oprette en logger: vi gør dette ved at bruge de statiske LoggerFactory.getLogger() metoder. Metodeparameteren er den klasse, hvis operation vil blive logget. Lad os køre vores kode:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Konsoludgang:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Hvad ser vi her? Først ser vi en fejlmeddelelse. Dette er et resultat af, at vi nu mangler de nødvendige indstillinger. Derfor er vores logger i øjeblikket kun i stand til at udsende fejlmeddelelser (ERROR) og kun til konsollen. Logger.info () metoden virkede ikke. Men logger.error() gjorde det! På konsollen ser vi den aktuelle dato, metoden, hvor fejlen opstod ( main), ordet "FEJL" og vores besked! FEJL er logningsniveauet. Generelt, hvis en logpost er markeret med ordet "FEJL", så er der opstået en fejl på dette tidspunkt i programmet. Hvis posten er markeret med ordet "INFO", repræsenterer meddelelsen blot aktuelle informationer om den normale drift af programmet. SLF4J-biblioteket har en masse forskellige logningsniveauer, der lader dig konfigurere logning fleksibelt. Det hele er meget nemt at administrere: al den nødvendige logik er allerede i Java Logger -klassen. Du skal bare ringe til de relevante metoder. Hvis du vil logge en rutinemeddelelse, skal du kalde logger.info() metoden. For en fejlmeddelelse, brug logger.error() . For en advarsel, brug logger.warn()

Lad os nu tale om appender

En appender er det sted, hvor dine data går. På en måde det modsatte af en datakilde, altså "punkt B". Som standard udsendes data til konsollen. Bemærk, at vi i det foregående eksempel ikke behøvede at konfigurere noget: teksten dukkede op i konsollen, og Log4j-bibliotekets logger kan kun udsende meddelelser på ERROR-niveau til konsollen. Det er klart, at det er mere bekvemt for folk at læse og skrive logfiler i en tekstfil. For at ændre loggerens standardadfærd skal vi konfigurere vores filtilføjelse. For at komme i gang skal du oprette en log4j.xml-fil direkte i src-mappen. Du er allerede bekendt med XML-formatet: vi havde for nylig en lektion om det :) Her er indholdet af filen:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Ikke noget særligt specielt eller svært her :) Men lad os alligevel gennemgå indholdet.
<Configuration status="INFO">
Dette er den såkaldte StatusLogger. Den er ikke relateret til vores logger og bruges i Log4js interne processer. Hvis du indstiller status="TRACE" i stedet for status="INFO", og alle informationer om Log4j's interne arbejde vil blive vist på konsollen (StatusLogger viser data på konsollen, selvom vores appender er en fil). Vi har ikke brug for det nu, så lad os lade det være som det er.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Her laver vi vores appender. <File> -tagget angiver, at det vil være en filtilføjelse. name="MyFileAppender" angiver navnet på tilføjelsen. fileName="C:\Users\Brugernavn\Desktop\testlog.txt" angiver stien til logfilen, hvor alle data vil blive skrevet. append="true" angiver, om dataene skal skrives i slutningen af ​​filen. I vores tilfælde er det præcis, hvad vi vil gøre. Hvis du indstiller værdien til false, vil det gamle indhold af logfilen blive slettet hver gang programmet startes. <PatternLayout pattern="%d{ååå-MM-dd TT:mm:ss.SSS} [%t] %-5niveau %logger{36} - %msg%n"/>angiver formateringsindstillingerne. Her kan vi bruge regulære udtryk til at tilpasse, hvordan tekst formateres i vores log.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Her angiver vi rodniveauet. Vi har sat "INFO"-niveauet, hvilket betyder, at alle meddelelser, hvis niveauer er højere end INFO (ifølge tabellen, som vi kiggede på ovenfor) ikke bliver logget. Vores program vil have 3 beskeder: en INFO, en ADVARSEL og en FEJL. Med den aktuelle konfiguration vil alle 3 beskeder blive logget. Hvis du ændrer rodniveauet til FEJL, vil kun den sidste besked fra LOGGER.error()-metodekaldet ende i loggen. Derudover er der også en henvisning til bilaget her. For at oprette en sådan reference skal du oprette et <ApprenderRef> -tag inde i <Root> -tagget og tilføje ref='din appender's name'- attribut til det. I tilfælde af at du har glemt det, er det her, vi angiver tillæggets navn: <. Og her er vores kode!

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Selvfølgelig er det lidt skævt (at fange en RuntimeException er en tvivlsom idé), men det er perfekt til vores formål :) Lad os køre vores main() -metode 4 gange i træk og se på vores testlog.txt-fil. Du behøver ikke oprette det på forhånd: biblioteket vil gøre dette automatisk. Alt fungerede! :) Nu har du en konfigureret logger. Du kan lege med nogle af dine gamle programmer og tilføje logger-kald til hver metode. Så se på den resulterende log :) Den overvejer emnet logning i dybden. Det ville være udfordrende at læse det hele på én gang. Når det er sagt, indeholder det en masse yderligere nyttig information. For eksempel vil du lære, hvordan du konfigurerer loggeren, så den opretter en ny tekstfil, hvis vores testlog.txt-fil når en vis størrelse :) Og det afslutter vores klasse! I dag blev du bekendt med et meget vigtigt emne, og denne viden vil helt sikkert være nyttig for dig i dit fremtidige arbejde. Indtil næste gang! :)
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION