Bons exemples utilisant java.util.logging [fermé]

273

Je souhaite utiliser des journaux dans mon programme. J'ai entendu parler de java.util.logging , mais je ne sais pas par où commencer.

Y a-t-il des exemples de ce que je peux faire avec la journalisation? Comment utiliser la journalisation dans mon propre programme?

Renato Dinhani
la source
7
Vous pouvez commencer ici: slf4j.org/manual.html
Jeremy
1
Je suis d'accord avec Steven Vascellaro. Je suis fatigué de voir des articles utiles détruits à cause de la police du sujet sans fin pratique. De plus, respectueusement en désaccord avec Jeremy, car OP a posé des questions sur java.util.logging. Je suis également intéressé par la journalisation native (merci pour la réponse, grwww!)
NOP
Pour enregistrer les données sur une seule ligne: log.log (Level.INFO, "Mon message {0}", nouvel objet [] {myDataId});
Mitja Gustin

Réponses:

335

java.util.logging vous évite d'avoir à transporter un fichier jar de plus avec votre application, et cela fonctionne bien avec un bon formateur.

En général, au sommet de chaque classe , vous devriez avoir:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Ensuite, vous pouvez simplement utiliser diverses fonctionnalités de la classe Logger .


Utilisez Level.FINEpour tout ce qui débogue au niveau supérieur du flux d'exécution:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Utilisez Level.FINER/ à l' Level.FINESTintérieur des boucles et dans des endroits où vous n'aurez pas toujours besoin de voir autant de détails lors du débogage des problèmes de flux de base:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Utilisez les versions paramétrées des fonctions de journalisation pour éviter de générer des tonnes de déchets de concaténation de chaînes que le GC devra suivre. Object[]comme ci-dessus est bon marché, sur l'allocation de pile généralement.


Avec la gestion des exceptions, enregistrez toujours les détails complets de l'exception:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Je passe toujours ex.toString()le message ici, car lorsque je " grep -n" pour " Exception" dans les fichiers journaux, je peux aussi voir le message. Sinon, il se trouvera sur la prochaine ligne de sortie générée par le vidage de la pile, et vous devez également disposer d'un RegEx plus avancé pour correspondre à cette ligne, ce qui vous donne souvent plus de sortie que vous n'en avez besoin.

grwww
la source
3
Cela écrit-il dans un fichier quelconque? Je ne pouvais pas encore le faire fonctionner dans mon programme. J'ai la ligne initiale que vous avez mais rien n'a été travaillé jusqu'à présent.
Doug Hauf
5
Comment voyez-vous les journaux? Une bibliothèque que j'utilise initialise les objets Logger et utilise la .fine()méthode pour se connecter, mais je n'arrive pas à afficher les messages ...
Anubian Noob
7
Je programme en Java depuis 1998. J'ai toujours trouvé que la journalisation en Java était beaucoup plus un casse-tête que nécessaire. C'est de loin l'explication la plus simple de la connexion à Java que j'ai lue. Concis aussi.
Steve McLeod
30
Il est intéressant que personne n'ait mentionné où l'on peut trouver les fichiers journaux.
Ahmedov
4
Si vous vous demandez où vont les journaux, assurez-vous d'avoir configuré un gestionnaire pour l'enregistreur. Pour simplement afficher les journaux sur la console, utilisez un nouveau ConsoleHandler et ajoutez-le à votre enregistreur à l'aide de la méthode addHandler. Assurez-vous d'appeler setLevel à la fois sur l'enregistreur et sur le gestionnaire.
Craig Brown
67

Devrait déclarer l'enregistreur comme ceci:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

donc si vous refactorisez le nom de votre classe, cela suit.

J'ai écrit un article sur Java Logger avec des exemples ici .

hanoo
la source
53

Il existe de nombreux exemples et également de différents types de journalisation. Jetez un œil au package java.util.logging .

Exemple de code:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

Sans coder en dur le nom de la classe :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}
Ankit
la source
15
Pourquoi ne pas définir le nom du journal sur Main.class.getSimpleName()? De cette façon, l'outil de refactoring va le changer correctement si nécessaire et pourtant, ce n'est pas aussi maladroit que votre deuxième solution.
Pijusn
3
Faire un stacktrace pour un nom d'enregistreur est un hack, lent et peu orthodoxe. Il se cassera également et vous donnera des noms étranges pour les proxys AOP ou autres codages extraordinaires.
Adam Gent
9
-1 pour l'activité stacktrace. C'est lent et empêche potentiellement les optimisations du compilateur.
phooji
4
Pourquoi la "lenteur" importerait-elle du tout lors de l'initialisation de l'enregistreur? Les mentions de lenteur sont ce que la plupart des gens appellent l'optimisation prématurée (Oui, le code a l'air un peu hack).
mikkom
3
@AndrewMcKinlay Dans quelle situation cela casse-t-il quelque chose? Si la balise logger est censée être la même que le nom de la classe, cela semble parfaitement correct. Les outils de refactoring vont le renommer automatiquement tandis que, s'il s'agissait d'une chaîne codée en dur, l'outil de refactoring peut soit la sauter, soit dire "Voulez-vous également la renommer?".
Pijusn
23

SLF4J est une meilleure façade de journalisation que Apache Commons Logging (ACL). Il a des ponts vers d'autres cadres de journalisation, faisant des appels directs à ACL, Log4J ou Java Util Logging via SLF4J, de sorte que vous pouvez diriger toutes les sorties vers un fichier journal si vous le souhaitez, avec un seul fichier de configuration de journal. Pourquoi votre application utiliserait-elle plusieurs cadres de journalisation? Parce que les bibliothèques tierces que vous utilisez, en particulier les plus anciennes, le font probablement.

SLF4J prend en charge diverses implémentations de journalisation. Il peut tout sortir en sortie standard, utiliser Log4J ou Logback (recommandé sur Log4J).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
la source
9

J'utiliserais minlog , personnellement. C'est extrêmement simple, car la classe de journalisation est de quelques centaines de lignes de code.

Chris Dennett
la source
3
Pour un encombrement minimal, c'est la bibliothèque à choisir.
h3xStream
0

Je vous suggère d'utiliser l'utilitaire de journalisation des communs d'Apache. Il est hautement évolutif et prend en charge des fichiers journaux distincts pour différents enregistreurs. Voyez ici .

nIKUNJ
la source
11
Bonne suggestion! essayez néanmoins de répondre à ce qu'ils demandent, sinon laissez simplement un commentaire;)
Ordiel