3.1 Elenco dei livelli di evento

La registrazione è il processo di registrazione di tutti gli eventi che si verificano mentre il programma è in esecuzione. Il tuo dovere di programmatore è record everything importantperché poi, quando productionci saranno errori strani e/o gravi, non avrai nient'altro oltre a questi log.

Qualsiasi errore verrà eliminato molte volte più velocemente se disponi di tutte le informazioni al riguardo e di tutta la cronologia delle chiamate. Ma da qui segue una semplice conclusione: registrare tutto in generale: chiamate di tutti i metodi, valori di tutti i parametri.

Anche questa non è un'opzione: troppe informazioni sono tanto dannose quanto troppo poche. Abbiamo bisogno di una registrazione intelligente. Fatto dall'uomo per l'uomo. E qui arriviamo al primo fatto sulla registrazione: tutte le voci nel registro sono divise in categorie anche al momento della loro creazione.

Elenco dei livelli di evento

Il programmatore, quando scrive un evento nel registro, deve decidere da solo quanto sia importante questa informazione. Il livello di gravità dell'evento è scelto dall'autore del messaggio. Esistono log4j5 livelli di importanza delle informazioni registrate:

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

Di seguito ne parleremo in modo più dettagliato.

3.2 DEBUG

Il livello DEBUGè considerato il meno importante. Le informazioni scritte nel registro con questo livello di importanza sono necessarie solo durante il debug dell'applicazione. Per registrare le informazioni necessarie durante il debug, viene utilizzato il metodo debug().

Esempio:

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;
        }
    }
}

Fai attenzione, il metodo debugè proprio all'inizio del metodo (il metodo non ha ancora avuto il tempo di fare nulla) e scrive nel log il valore della variabile passata al metodo. Questo è il caso d'uso più comune per il metodo debug().

3.3 INFORMAZIONI e AVVISO

I due livelli successivi sono INFOe WARN. Ci sono due metodi per loro - info()e warn().

Il livello INFOè usato semplicemente per messaggi informativi: succede questo e quello. Quando si avvia l'analisi di un errore nel registro, può essere molto utile leggerne il background. Il metodo è perfetto per questo info().

Il livello WARNviene utilizzato per scrivere avvisi (dalla parola warning ). Di solito, con questo livello di importanza, viene scritta l'informazione che qualcosa è andato storto, ma il programma sa cosa fare in questa situazione.

Ad esempio, nel processo di scrittura di un file su disco, si è scoperto che tale file esiste già. Qui il programma può registrare un avviso (avviso), ma mostrare all'utente una finestra di dialogo e offrire di selezionare un nome file diverso.

Esempio:

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

    public boolean saveFile(FileData file) {
        logger.info(“save the file ” + file.getName());
        boolean resultOK = SaveUtils.save(file);
        if (resultOK) return true;

        logger.warn(“file writing problem ” + file.getName());
        String filename = Dialog.selectFile();
        boolean result = SaveUtils.save(file, filename);
        return result;
    }

3.4 ERRORE e FATALE

Infine, i due livelli di registrazione più importanti sono ERRORe FATAL. Per loro esistono anche metodi speciali con gli stessi nomi: error()e fatal().

Decisero inoltre di dividere gli errori in due categorie: errori ordinari ed errori fatali . Un errore irreversibile si traduce molto spesso in un arresto anomalo dell'applicazione (per le applicazioni desktop) o un arresto anomalo del servizio Web (per le applicazioni Web).

Un altro buon esempio è il sistema operativo Windows. Se il tuo programma si è appena bloccato, dal punto di vista del sistema operativo, questo è Error. E se il sistema operativo stesso è caduto e vedi la schermata blu della morte di Windows, allora questo è già Fatal error.

Nelle applicazioni Java, gli eventi Errorsono spesso Fatalassociati a eccezioni sollevate. Esempio:

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;
        }
    }
}

3.5 Cosa registrare

Ovviamente non vale la pena registrare tutto di seguito. Nella maggior parte dei casi, ciò peggiora notevolmente la leggibilità del registro e, dopotutto, il registro viene scritto in primo luogo per essere letto.

Inoltre, non è possibile scrivere nel registro varie informazioni personali e finanziarie. Ora con questo rigorosamente e facilmente puoi incorrere in multe o azioni legali. Prima o poi, un tale registro colerà di lato e quindi non ci saranno problemi.

Quindi cosa dovrebbe essere registrato?

Innanzitutto, è necessario registrare l'avvio dell'applicazione . Dopo l'avvio dell'applicazione, si consiglia di registrare la sua modalità operativa e varie impostazioni importanti: ciò renderà più facile la lettura del registro in futuro.

In secondo luogo, è necessario registrare lo stato di tutti i servizi di terze parti con cui funziona l'applicazione: sistemi di posta, eventuali servizi esterni. Come minimo, è necessario proteggere il momento della connessione ad essi per assicurarsi che funzionino correttamente.

In terzo luogo, tutte le eccezioni devono essere registrate . Se sono previsti, le informazioni su di essi possono essere scritte in modo compatto. Le informazioni complete sulle eccezioni forniscono il 50% -80% di informazioni importanti durante la ricerca di un bug.

È inoltre necessario registrare l'arresto dell'applicazione . L'applicazione deve terminare normalmente e non generare dozzine di errori nel registro. Spesso in questo posto puoi trovare attività bloccate, problemi con il pool di thread o problemi con l'eliminazione di file temporanei.

Assicurati di registrare tutto ciò che riguarda la sicurezza e l'autorizzazione dell'utente . Se un utente tenta di accedere o reimpostare la propria password 10 volte di seguito, questa informazione dovrebbe essere riportata nei registri.

Registra quante più informazioni possibili sulle attività asincrone : le eccezioni vengono spesso perse in tali thread. Per un'attività asincrona, assicurati di registrarne l'inizio e la fine. Il completamento riuscito dovrebbe essere registrato allo stesso modo di uno problematico.

Cos'altro? Avvio di attività a tempo, avvio di attività archiviate SQL-procedures, sincronizzazione dei dati, tutto ciò che riguarda le transazioni distribuite. Penso che sia abbastanza per cominciare. Aggiungerai a questo elenco in futuro.