1.1 Introduzione ai log

Il registro è un elenco di eventi che si sono verificati. Quasi come un diario o un diario nautico. Bene, di conseguenza, un logger è un oggetto con cui puoi accedere. Nella programmazione, è consuetudine registrare quasi tutto. E in Java tutto è così e anche un po 'di più.

logger java

Il fatto è che i programmi Java sono molto spesso applicazioni server di grandi dimensioni senza interfaccia utente, console e così via. Elaborano le richieste di migliaia di utenti contemporaneamente e spesso si verificano vari errori. Soprattutto quando diversi thread iniziano a interferire tra loro.

E, infatti, l'unico modo per trovare errori e guasti raramente riprodotti in una situazione del genere è scrivere nel registro / file tutto ciò che accade in ogni thread.

Molto spesso, nel registro vengono scritte informazioni sui parametri del metodo con cui è stato chiamato, tutti gli errori intercettati e molte informazioni intermedie. Più il registro è completo, più è facile ripristinare la sequenza degli eventi e risalire alle cause di un guasto o di un errore.

Ma più grande è il registro, più difficile è lavorarci. A volte i log raggiungono diversi gigabyte al giorno. Questo va bene.

1.2 Registri non riusciti

Come primi log, gli sviluppatori hanno utilizzato semplicemente l'output sulla console . È conveniente farlo durante il debug dell'applicazione, quando tutte le informazioni importanti e i valori delle variabili vengono scritti nella console. Ma un tale registro è completamente inapplicabile durante il normale funzionamento dell'applicazione.

In primo luogo, l'applicazione potrebbe voler inviare qualcosa alla console stessa e l'utente non desidera affatto vedere le informazioni di servizio destinate al programmatore.

In secondo luogo, la dimensione del buffer della console è limitata, non puoi scrivere molto lì.

Infine, in terzo luogo, le informazioni sugli errori del programma raccolte per un lungo periodo di tempo dovrebbero essere inviate agli sviluppatori del programma. Ed è più conveniente scrivere tutte queste informazioni contemporaneamente in un file.

Gli sviluppatori hanno risolto rapidamente il primo problema - hanno escogitato un altro flusso di output - System.err. Puoi scrivere messaggi su di esso e verranno inviati a un thread separato e non alla console standard.

E anche il problema con la scrittura su un file è stato risolto:

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

Ma anche in questa forma non ha risolto l'intero problema, quindi è stato deciso di creare una libreria speciale che scrivesse i messaggi di registro in un file. Lo ha fatto in modo intelligente e ha consentito la flessibilità di configurare i filtri per eventi e dati registrati.

L'intero processo di registrazione, infatti, si compone di tre parti:

  • La prima parte è la raccolta di informazioni .
  • La seconda parte è il filtraggio delle informazioni raccolte.
  • La terza parte è la registrazione delle informazioni selezionate.

1.3 Introduzione al logger log4j

Il primo logger popolare nella comunità Java è stato il log4j. Includerlo nel progetto è molto semplice, per questo devi aggiungere solo un paio di righe al tuo pom.xml


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

L'interazione del tuo programma con un tale logger sarebbe simile a questa:

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

Qui succedono tre cose:

La creazione dell'oggetto è evidenziata in verde Logger . Il suo oggetto è memorizzato in una variabile statica per un comodo ulteriore lavoro con esso. E anche getLogger()le informazioni sulla classe in cui vengono raccolte le informazioni vengono passate al metodo.

La linea evidenziata in blu è dove registriamo le informazioni di valore solo durante il debug . Per questo, viene utilizzato un metodo speciale:debug()

Infine, la riga in cui salviamo l'eccezione che si è verificata nel registro è evidenziata in rosso . Le eccezioni sono potenziali errori, quindi il file error().