web-dev-qa-db-fra.com

Logger contre System.out.println

J'utilise le plugin PMD pour Eclipse et cela me donne une erreur lors de l'utilisation de System.out.println() avec l'explication:

System. (Out | err) .print est utilisé, pensez à utiliser un enregistreur.

Ma question est - Qu'est-ce qu'un enregistreur? Comment est-il utilisé pour imprimer à l'écran? Pourquoi est-ce mieux?

41
Amir Rachum

Voir cette courte introduction à log4j .

Le problème réside dans l'utilisation de System.out pour imprimer les informations de débogage ou de diagnostic. Il s'agit d'une mauvaise pratique car vous ne pouvez pas facilement modifier les niveaux de journal, les désactiver, les personnaliser, etc.

Cependant, si vous utilisez légitimement System.out pour imprimer des informations à l'utilisateur, vous pouvez ignorer cet avertissement.

29
matt b

Si vous utilisez System.out | err.println (..) pour imprimer les informations utilisateur sur la console dans la méthode main () de votre application, vous ne faites rien de mal. Vous pouvez vous débarrasser du message en insérant un commentaire "// NOPMD".

System.out.println("Fair use of System.out.println(..).");// NOPMD

Il y a une option "Marquer comme révisé" dans le Contour des infractions PMD à cet effet.

Bien sûr, vous pouvez tromper PMD avec l'extrait de code suivant:

PrintStream out=System.out;
out.println("I am fooling PMD.");  

En dehors de votre main () - La méthode utilise un système de journalisation comme par exemple Log4j.

MISE À JOUR:

Vous pouvez également modifier la règle PMD "SystemPrintln" pour utiliser le XPath suivant:

//MethodDeclaration[@MethodName!="main"]//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
] | //Initializer//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
]

Cela ignorera System.out.println, etc. dans toute méthode nommée 'main' dans votre code, mais recherchez System.out.println dans le code d'initialisation. J'aime ça, car de mon point de vue, System.out.println est sûr dans la méthode 'main (String args [])'. Mais à utiliser avec prudence, je dois vérifier où dans le AST un System.out.println peut également se produire et devoir adapter le XPath.

11

Les enregistreurs ont plusieurs niveaux de journalisation.

Si nous écrivons un vrai programme court, juste à des fins d'apprentissage System.out.println c'est bien mais quand nous développons un projet logiciel de qualité, nous devons utiliser un enregistreur professionnel et éviter les SOP.

Un enregistreur professionnel offre différents niveaux de journalisation et de flexibilité. Nous pouvons obtenir le message du journal en conséquence. Par exemple, les messages du groupe X doivent être imprimés uniquement sur PRODUCTION, les messages du groupe Y doivent être imprimés sur ERREUR, etc.

Nous avons une option limitée pour rediriger les messages dans System.out, mais dans le cas d'un enregistreur, vous avez des annexes qui fournissent un certain nombre d'options. Nous pouvons même créer une option de sortie personnalisée et la rediriger vers cela.

5
kalakanhu

Ce lien fournit des informations plus concises sur la façon d'utiliser Log4j: N'utilisez pas System.out.println! Il n'a cependant qu'un petit défaut, vous devriez plutôt ne pas mettre la bibliothèque dans /jre/lib/ext, mais uniquement dans le chemin de classe d'exécution de votre application et expédiez-le.

L'avantage est que vous pouvez utiliser des niveaux de journalisation pour indiquer l'importance des informations, de sorte que vous pouvez configurer en externe les niveaux à afficher/masquer dans la sortie (afin de ne pas être gêné par les informations inutiles après-tout) , à quoi devrait ressembler la sortie (par exemple, inclure un horodatage, un ID de thread, un nom de classe, un nom de méthode, etc.) et où la sortie doit être écrite (par exemple la console, un fichier, un e-mail, etc.) et dans le cas par exemple de fichiers aussi comment ils devraient être créés (par exemple, grouper par année, mois et/ou jour).

Il existe plusieurs implémentations d'enregistreur comme le Java SE's builtin Java.util.logging.Logger , le plus connu Apache Commons Logging , le populaire Apache Log4j , son successeur Logback , etc. Vous pouvez utiliser Slf4j comme couche d'abstraction supplémentaire pour basculer entre l'un de ces enregistreurs chaque fois que nécessaire.

5
BalusC

Il semble que PMD suppose que vous appelez System.out.println() à des fins de débogage; des trucs comme "Im in ur method, executing ur codez".

Si vous faites cela, vous passerez un bien meilleur moment à écrire dans un enregistreur comme Log4J , car il aura plusieurs options de streaming que de simplement filtrer.

Si, toutefois, vous utilisez une application console et appelez System.out dans le cadre de cela, ignorez l'avertissement.

4
Randolpho

System.out.println n'est pas bon à utiliser car il ne peut pas être configuré. Au lieu de cela, Logger peut être configuré pour se connecter à différents niveaux. Il a beaucoup d'autres fonctionnalités.

0
fastcodejava