JavaRush /Java Blog /Random-IT /Perché è necessaria la registrazione?

Perché è necessaria la registrazione?

Pubblicato nel gruppo Random-IT
Ciao! Quando scrivo lezioni, noto in particolare se un particolare argomento verrà sicuramente utilizzato nel lavoro reale. Perché è necessaria la registrazione - 1 Quindi, ATTENZIONE! L'argomento che toccheremo oggi ti sarà sicuramente utile su tutti i tuoi progetti fin dal primo giorno di lavoro. Parleremo della registrazione. Questo argomento non è affatto difficile (direi anche facile). Ma al tuo primo lavoro ci sarà già abbastanza stress per affrontare le cose ovvie, quindi è meglio risolvere la questione a fondo adesso :) Quindi, cominciamo. Cos'è la registrazione? Il logging registra da qualche parte i dati sul funzionamento di un programma. Il luogo in cui vengono scritti questi dati è chiamato “ log ”. Sorgono due domande contemporaneamente: dove e quali dati vengono registrati? Cominciamo con "dove". È possibile registrare i dati operativi del programma in molti posti diversi. Ad esempio, durante i tuoi studi spesso invii i dati alla console utilizzando System.out.println(). Questa è la registrazione reale, anche se la più semplice. Naturalmente, questo non è molto conveniente per il cliente o il team di supporto del prodotto: ovviamente non vorranno installare l'IDE e monitorare la console :) Esiste anche un formato più familiare per registrare le informazioni: in un file di testo. È molto più facile per le persone leggerli in questo modo e sicuramente molto più facile da archiviare! Ora la seconda domanda: quali dati relativi al funzionamento del programma dovrebbero essere registrati nel registro? Ma qui tutto dipende da te! Il sistema di registrazione Java è molto flessibile. Puoi configurarlo in modo tale che venga registrato l'intero progresso del tuo programma. Da un lato, questo è positivo. Ma d'altra parte, immagina quale dimensione possono raggiungere i log di Facebook o Twitter se tutto è scritto lì. Aziende così grandi probabilmente hanno la capacità di archiviare anche questa quantità di informazioni. Ma immaginate quanto sarebbe difficile cercare informazioni su un errore critico nei log contenenti 500 gigabyte di testo? È anche peggio di un ago in un pagliaio. Pertanto, la registrazione in Java può essere configurata in modo che nel registro (log) vengano scritti solo i dati di errore. O anche solo errori critici! Tuttavia, dire "accedere a Java" non è del tutto corretto. Il fatto è che la necessità di registrazione è nata tra i programmatori prima che questa funzionalità fosse aggiunta al linguaggio. E quando Java ebbe la propria libreria di logging, tutti usavano già la libreria log4j. La storia della comparsa del logging in Java è in realtà molto lunga e istruttiva; a tuo piacimento puoi leggere questo post su Habré . In breve, Java ha la propria libreria di registrazione, ma quasi nessuno la usa :) Successivamente, quando sono apparse diverse librerie di registrazione e tutti i programmatori hanno iniziato a usarne di diverse, è sorto un problema di compatibilità. Per evitare che le persone facciano la stessa cosa utilizzando una dozzina di librerie diverse con interfacce diverse, è stato creato il framework di astrazione slf4j(“Service Logging Facade per Java”). Si chiama astrazione perché sebbene utilizzi le classi slf4j e chiami i loro metodi, sotto il cofano hanno tutti i precedenti framework di registrazione in esecuzione: log4j, java.util.logging standard e altri. Se al momento hai bisogno di alcune funzionalità specifiche di log4j che altre librerie non hanno, ma non desideri collegare strettamente il progetto a questa particolare libreria, usa semplicemente slf4j. E già "tirerà" i metodi log4j. Se cambi idea e decidi che non hai più bisogno delle funzionalità di log4j, devi solo riconfigurare il "wrapper" (ovvero slf4j) per utilizzare un'altra libreria. Il tuo codice non smetterà di funzionare, perché in esso chiami metodi di slf4j e non di una libreria specifica. Una piccola digressione. Affinché i seguenti esempi funzionino, è necessario scaricare la libreria slf4j da qui e la libreria log4j da qui . Successivamente, dobbiamo decomprimere l'archivio e aggiungere i file jar di cui abbiamo bisogno al classpath tramite Intellij IDEA. Voci di menu: File -> Struttura del progetto -> Librerie Seleziona i jar necessari e aggiungili al progetto (ci sono molti jar negli archivi che abbiamo scaricato, guarda quelli che ti servono nelle immagini) Perché è necessaria la registrazione - 2Perché è necessaria la registrazione - 3Nota: queste istruzioni sono per quelli studenti che non sanno usare Maven. Se sai come usarlo, è meglio provare a iniziare da esso: di solito è molto più semplice. Se usi Maven , aggiungi questa dipendenza:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Ottimo, abbiamo sistemato le impostazioni :) Diamo un'occhiata a come funziona slf4j. Come possiamo essere sicuri che lo stato di avanzamento del programma sia registrato da qualche parte? Per questo abbiamo bisogno di due cose: un logger e un appender . Cominciamo con il primo. Un logger è un oggetto che gestisce completamente la tenuta dei registri . Creare un logger è molto semplice: viene eseguito utilizzando un metodo statico - LoggerFactory.getLogger(). Come parametro del metodo, è necessario passare una classe il cui lavoro verrà registrato. Eseguiamo il nostro codice:
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 record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
Output della console: ERRORE StatusLogger Nessun file di configurazione Log4j 2 trovato. Utilizzo della configurazione predefinita (registrazione solo degli errori nella console) o configurazioni fornite dall'utente a livello di codice. Imposta la proprietà di sistema "log4j2.debug" per mostrare la registrazione di inizializzazione interna di Log4j 2. Vedi https://logging.apache.org/log4j/2.x/manual/configuration.html per istruzioni su come configurare Log4j 2 15:49:08.907 [main] ERRORE MyTestClass - Si è verificato un errore nel programma! Cosa vediamo qui? Per prima cosa vediamo un messaggio di errore. È apparso perché al momento non abbiamo le impostazioni necessarie. Pertanto, il nostro logger ora può solo inviare messaggi di errore (ERROR) e solo alla console. Il metodo logger.info()non è stato eseguito. Ma logger.error()ha funzionato! La console visualizza la data corrente, il metodo in cui si è verificato l'errore ( main), la parola ERRORE e il nostro messaggio! ERROR è il livello di registrazione. In generale, se una voce del log è contrassegnata con la parola ERRORE, significa che in quel punto del programma si è verificato un errore. Se una voce è contrassegnata con la parola INFO, significa che si tratta semplicemente di informazioni attuali sul normale funzionamento del programma. La libreria SLF4J dispone di diversi livelli di registrazione che consentono di configurare in modo flessibile la registrazione. Sono molto facili da gestire: tutta la logica necessaria è già inclusa nella classe Logger. Devi solo chiamare i metodi necessari. Se vuoi pubblicare un messaggio normale, chiama il logger.info(). Messaggio di errore - logger.error(). Visualizza un avviso: logger.warn() ora parliamo dell'appender . L'appender è il luogo in cui arrivano i tuoi dati. Si potrebbe dire che l'opposto di un'origine dati è il "punto B". Per impostazione predefinita, i dati vengono inviati alla console. Tieni presente che nell'esempio precedente non abbiamo dovuto configurare nulla: il testo è apparso nella console stessa, ma il logger della libreria log4j può inviare alla console solo messaggi di livello ERROR. Ovviamente è più conveniente per le persone leggere i log da un file di testo e archiviarli negli stessi file. Per modificare il comportamento predefinito del logger, dobbiamo configurare il nostro file appender . Per cominciare, devi creare un file log4j.xml direttamente nella cartella src , o nella cartella delle risorse, se usi Maven, o nella cartella delle risorse, nel caso in cui usi Maven. Conosci già il formato xml, di recente abbiamo tenuto una conferenza al riguardo :) Ecco quale sarà il suo contenuto:
<?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>
Non sembra particolarmente complicato :) Ma passiamo comunque ai contenuti.
<Configuration status="INFO">
Questo è il cosiddetto status-logger. Non è correlato al nostro logger ed è utilizzato internamente da log4j. Puoi impostare status=”TRACE” invece di status=”INFO”, e tutte le informazioni sul funzionamento interno di log4j verranno inviate alla console (il registratore di stato invia i dati alla console, anche se il nostro appender per il programma è file -basato). Non ne abbiamo bisogno ora, quindi lasceremo tutto così com'è.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Qui creiamo il nostro appender. Il tag <File>indica che sarà un file. name="MyFileAppender"- il nome del nostro appender. fileName="C:\Users\Username\Desktop\testlog.txt"— percorso del file di registro in cui verranno scritti tutti i dati. append="true"— se è necessario scrivere dati aggiuntivi alla fine del file. Nel nostro caso sarà così. Se impostato su false , il vecchio contenuto del registro verrà eliminato ogni volta che il programma viene riavviato. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Queste sono le impostazioni di formattazione. Qui possiamo utilizzare le espressioni regolari per personalizzare il formato del testo nel nostro registro.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Qui specifichiamo il livello di registrazione (livello root). Abbiamo impostato il livello INFO: cioè tutti i messaggi a livelli superiori a INFO (secondo la tabella che abbiamo visto sopra) non verranno inclusi nel log. Avremo 3 messaggi nel nostro programma: uno INFO, uno WARN e uno ERROR. Con la configurazione attuale, tutti e 3 i messaggi verranno scritti nel registro. Se si modifica il livello root in ERROR, verrà registrato solo l'ultimo messaggio di LOGGER.error(). Inoltre, qui viene inserito un collegamento all'appender. Per creare un collegamento di questo tipo, è necessario <Root>creare un tag all'interno del tag <ApprenderRef>e aggiungervi il parametro ref=”Name твоего аппендера”. Abbiamo creato qui il nome dell'appender, nel caso te lo fossi dimenticato: <File name="MyFileAppender" Ed ecco il codice del nostro programma!
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("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Certo, è un po' storto (catturare RuntimeException è un'idea mediocre), ma è perfetto per i nostri scopi :) Eseguiamo il nostro metodo main()4 volte di seguito e guardiamo il nostro file testlog.txt. Non è necessario crearlo in anticipo: la libreria lo farà automaticamente. Tutto ha funzionato! :) Ora hai un logger configurato. Puoi giocare con alcuni programmi che hai scritto in precedenza, aggiungendo chiamate al logger a tutti i metodi e osservare il registro risultante :) Per ulteriori letture, consiglio vivamente questo articolo . Lì il tema del logging viene discusso in modo approfondito e non sarà facile leggerlo tutto d'un fiato. Ma contiene molte informazioni aggiuntive utili. Ad esempio, imparerai come configurare un logger in modo che crei un nuovo file di testo se il nostro file testlog.txt raggiunge una certa dimensione :) E questa è la fine della nostra lezione! Oggi hai appreso un argomento molto importante e questa conoscenza ti sarà sicuramente utile nel tuo lavoro futuro. Ci vediamo! :)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION