3.1 Liste des niveaux d'événement

La journalisation est le processus d'enregistrement de tous les événements qui se produisent pendant l'exécution du programme. Votre devoir en tant que programmeur est record everything importantqu'en cas productiond'erreurs étranges et / ou graves, vous n'aurez rien d'autre que ces journaux.

Toute erreur sera éliminée plusieurs fois plus rapidement si vous disposez de toutes les informations à ce sujet et de tout l'historique des appels. Mais une conclusion simple en découle - pour tout enregistrer en général : appels de toutes les méthodes, valeurs de tous les paramètres.

Ce n'est pas non plus une option - trop d'informations sont tout aussi mauvaises que trop peu. Nous avons besoin d'une journalisation intelligente. Fait par l'homme pour l'homme. Et nous arrivons ici au premier fait concernant la journalisation - toutes les entrées du journal sont divisées en catégories même au moment de leur création.

Liste des niveaux d'événement

Le programmeur, lorsqu'il écrit un événement dans le journal, doit décider lui-même de l'importance de cette information. Le niveau de gravité de l'événement est choisi par l'auteur du message. Il log4jexiste 5 niveaux d'importance des informations enregistrées :

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

Ci-dessous, nous en parlerons plus en détail.

3.2 DÉBOGAGE

Le niveau DEBUGest considéré comme le moins important. Les informations écrites dans le journal avec ce niveau d'importance ne sont nécessaires que pendant le débogage de l'application. Afin de consigner les informations nécessaires lors du débogage, la méthode est utilisée debug().

Exemple:

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

Attention, la méthode debugest au tout début de la méthode (la méthode n'a pas encore eu le temps de faire quoi que ce soit) et écrit la valeur de la variable passée à la méthode dans le log. C'est le cas d'utilisation le plus courant de la méthode debug().

3.3 INFO et AVERTISSEMENT

Les deux niveaux suivants sont INFOet WARN. Il existe deux méthodes pour eux - info()et warn().

Le niveau INFOest utilisé simplement pour les messages d'information : ceci et cela se produit. Lorsque vous commencez à analyser une erreur dans le journal, il peut être très utile de lire son arrière-plan. La méthode est parfaite pour cela info().

Le niveau WARNest utilisé pour écrire des avertissements (du mot avertissement ). Habituellement, avec ce niveau d'importance, des informations sont écrites indiquant que quelque chose s'est mal passé, mais le programme sait quoi faire dans cette situation.

Par exemple, lors du processus d'écriture d'un fichier sur le disque, il s'est avéré qu'un tel fichier existait déjà. Ici, le programme peut enregistrer un avertissement (avertissement), mais montrer à l'utilisateur une boîte de dialogue et proposer de sélectionner un nom de fichier différent.

Exemple:

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 ERREUR et FATAL

Enfin, les deux niveaux de journalisation les plus importants sont ERRORet FATAL. Pour eux, il existe également des méthodes spéciales portant les mêmes noms : error()et fatal().

Ils ont également décidé de diviser les erreurs en deux catégories : les erreurs ordinaires et les erreurs fatales . Une erreur fatale entraîne le plus souvent un plantage de l'application (pour les applications de bureau) ou un plantage du service Web (pour les applications Web).

Un autre bon exemple est le système d'exploitation Windows. Si votre programme vient de planter, alors du point de vue du système d'exploitation, c'est Error. Et si le système d'exploitation lui-même est tombé et que vous voyez l'écran bleu de la mort de Windows, alors c'est déjà Fatal error.

Dans les applications Java, les événements Errorsont le plus souvent Fatalassociés à des exceptions déclenchées. Exemple:

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 Quoi enregistrer

Bien sûr, cela ne vaut pas la peine de tout enregistrer à la suite. Dans la plupart des cas, cela aggrave fortement la lisibilité du journal et, après tout, le journal est écrit en premier lieu pour être lu.

De plus, vous ne pouvez pas écrire diverses informations personnelles et financières dans le journal. Maintenant, avec cela strictement et facilement, vous pouvez vous heurter à des amendes ou à des poursuites. Tôt ou tard, une telle bûche fuira sur le côté et il n'y aura alors aucun problème.

Alors, que faut-il enregistrer ?

Tout d'abord, vous devez enregistrer le démarrage de l'application . Après le démarrage de l'application, il est recommandé de consigner son mode de fonctionnement et divers paramètres importants - cela facilitera la lecture du journal à l'avenir.

Deuxièmement, vous devez enregistrer l'état de tous les services tiers avec lesquels votre application fonctionne : systèmes de messagerie, éventuels services externes. Au minimum, vous devez sécuriser le moment de la connexion avec eux pour vous assurer qu'ils fonctionnent correctement.

Troisièmement, toutes les exceptions doivent être enregistrées . S'ils sont attendus, les informations les concernant peuvent être écrites de manière compacte. Des informations complètes sur les exceptions donnent 50% à 80% des informations importantes lors de la recherche d'un bogue.

Vous devez également enregistrer l'arrêt de l'application . L'application doit se terminer normalement et ne pas générer des dizaines d'erreurs dans le journal. Souvent, à cet endroit, vous pouvez trouver des tâches bloquées, des problèmes avec le pool de threads ou des problèmes de suppression de fichiers temporaires.

Assurez-vous de consigner tout ce qui concerne la sécurité et l'autorisation des utilisateurs . Si un utilisateur essaie de se connecter ou de réinitialiser son mot de passe 10 fois de suite, ces informations doivent être reflétées dans les journaux.

Enregistrez autant d'informations que possible sur les tâches asynchrones - les exceptions sont souvent perdues dans ces threads. Pour une tâche asynchrone, assurez-vous de consigner son début et sa fin. Un achèvement réussi doit être enregistré de la même manière qu'un problème.

Quoi d'autre? Lancer des tâches chronométrées, lancer des tâches stockées SQL-procedures, synchroniser des données, tout ce qui concerne les transactions distribuées. Je pense que c'est suffisant pour commencer. Vous ajouterez à cette liste à l'avenir.