Logger contre Système.hors.println

j'utilise le plugin PMD pour eclipse et il me donne une erreur en utilisant System.out.println() avec l'explication:

Système

.(|err).l'impression est utilisé, pensez à utiliser un enregistreur.

ma question Est: Qu'est-ce qu'un Logger? Comment est-il utilisé pour imprimer à l'écran? Pourquoi est-il mieux?

38
demandé sur Community 2010-05-01 18:44:43

6 réponses

voir cette brève introduction au log4j .

le problème est d'utiliser System.out pour imprimer des informations de débogage ou de diagnostic. C'est une mauvaise pratique parce que vous ne pouvez pas facilement changer les niveaux de log, l'éteindre, le personnaliser, etc.

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

27
répondu matt b 2017-06-23 07:10:52

si vous utilisez System.|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 "Marque de l'examen"-Option " dans la PMD-les Violations les grandes lignes de cette fin.

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

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

à l'extérieur de votre main ()-méthode utiliser un Log-système comme par exemple Log4j.

mise à jour:

vous pouvez aussi modifier la règle "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 le système.hors.println etc dans n'importe quelle méthode appelée 'main' dans votre code, mais vérifiez le système.hors.println en initialiseur de code. J'aime bien, parce que de mon point de vue, le Système.hors.println est sûr dans la méthode ' main (String args[])'. Mais utilisez avec prudence, je dois vérifier, où dans le système ASTA.hors.println peut également se produire et doit adapter le XPath.

11
répondu Michael Konietzka 2010-05-01 18:06:39

ce lien fournit des informations plus concises sur la façon d'utiliser Log4j: N'utilisez pas le système.hors.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 juste dans le chemin de classe runtime de votre application et de l'expédier le long.

l'avantage est que vous pouvez utiliser les niveaux de journalisation pour indiquer l'importance de l'information, de sorte que vous pouvez configurer extérieurement les niveaux à afficher/cacher dans le output (de sorte que vous ne soyez pas ennuyé par les-après tout - informations inutiles), comment la sortie devrait ressembler (par exemple inclure un timestamp, thread ID, classname, methodname, etc) et où la sortie devrait être écrite (par exemple la console, un fichier, un e-mail, etc) et dans le cas de fichiers par exemple aussi comment ils devraient être créés (par exemple groupe par année, mois et/ou jour).

il y a plusieurs implémentations de logger comme le builtin de Java SE java.util.logging.Logger , le convenienced Apache Commons Logging , le populaire Apache Log4j , son successeur Logback , etc. Vous pouvez utiliser Slf4j comme couche d'abstraction supplémentaire pour basculer entre ces loggers chaque fois que nécessaire.

5
répondu BalusC 2017-08-02 17:52:47

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 allez avoir un moment beaucoup mieux écrire à un logger comme Log4J , car il aura plusieurs options de diffusion en continu que juste pour l'écran.

si, cependant, vous faites une application de console et appelez System.out dans le cadre de cela, ignorez le avertissement.

4
répondu Randolpho 2010-05-01 14:50:13

Loggers a plusieurs niveaux pour la journalisation.

si nous écrivons un programme très court, juste pour l'apprentissage System.out.println est très bien, mais quand nous développons un projet de logiciel de qualité, nous devrions utiliser logger professionnel et les SOP doivent être évités.

un loggers professionnels fournit différents niveaux pour l'exploitation et la flexibilité. Nous pouvons obtenir le message log en conséquence. Par exemple, les messages du groupe X ne doivent être imprimés que sur Les messages de PRODUCTION, de 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 logger vous avez appenders qui fournit des nombres d'options. Nous pouvons même créer une option de sortie personnalisée et la rediriger vers celle-ci.

4
répondu kalakanhu 2013-12-18 09:04:31

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 sur différents niveaux. Il a beaucoup d'autres fonctionnalités.

0
répondu fastcodejava 2010-05-02 14:50:55