log4j vs. System.out.println - avantages de l'enregistreur?
Je suis en utilisant log4j pour la première fois dans un projet. Un collègue programmeur m'a dit que l'utilisation de System.out.println
est considéré comme un mauvais style, et que log4j est quelque chose comme standard pour l'enregistrement des questions aujourd'hui.
Nous faire beaucoup de tests JUnit - System.out
choses s'avère être plus difficile à tester.
Donc j'ai commencé à utiliser log4j pour une Console de contrôleur de classe, c'est juste de la manipulation de paramètres de ligne de commande.
//log4j logger config
org.apache.log4j.BasicConfigurator.configure();
Logger logger = LoggerFactory.getLogger(Console.class);
Category cat = Category.getRoot();
Semble fonctionner:
logger.debug("String");
Produit:
1 [main] DEBUG project.prototype.controller.Console - String
J'ai eu deux questions concernant ce sujet:
- À partir de ma compréhension de base à l'aide de cet enregistreur doit me fournir confortable options pour écrire un fichier de log avec des horodatages - au lieu de spammer le console - si le mode debug est activé lors de l'enregistreur?
- Pourquoi Système..println plus difficile à tester? J'ai cherché sur stackoverflow et a trouvé un les tests de recette. Donc je me demande quel genre d'avantage j'ai vraiment l'utilisation de log4j.
source d'informationauteur wishi | 2010-04-28
Vous devez vous connecter pour publier un commentaire.
L'enregistreur donne la possibilité de définir différents niveaux d'importance des messages consignés et la capacité à utiliser les différents puits de la sortie de la console, un fichier, etc.
Aussi il est facile d'activer ou de désactiver uniquement un certain type de message lors de l'utilisation d'un enregistreur - par exemple, vous ne voulez pas voir tous les messages de débogage dans la production.
Je ne pense pas que l'utilisation d'enregistreurs offre des avantages significatifs dans les tests unitaires, mais je préfère encore là de toute façon. Dans les tests unitaires assertions sont habituellement ma principale préoccupation.
Btw, vous devriez vraiment envisager d'utiliser quelque chose comme Commons Logging ou SLF4J comme un journal de cadre de façade - c'est mauvais style pour attacher votre code spécifique de journalisation. Commune de Journalisation et de SLF4J permettre de changer facilement la journalisation des cadres si vous choisissez d'.
Tout ce que vous imprimez sur du Système.seront-aller à la "norme", et tandis que vous pouvez rediriger standard vers un fichier et de le comparer, qu'avez-vous, qui est très rigide. En outre, vous ne pouvez pas filtrer ce qui se passe à la norme si vous utilisez le Système.... tout ce qui sera imprimé. Avec log4j, vous pouvez définir différents niveaux de journalisation, de sorte que les messages de journalisation qui sont en dessous d'une certaine gravité/seuil d'importance ne sont pas imprimés (par exemple, si vous modifiez le niveau d'enregistrement pour l'AVERTIR, de DÉBOGUER et de messages d'information ne seront pas affichés plus).
En outre, log4j permet la connexion à être contrôlée sur une classe par classe de base, tandis que le Système.peut uniquement être contrôlé au niveau de la granularité de l'ensemble de l'application (si vous rediriger Système.hors, vous rediriger pour l'ensemble du programme). En revanche, chaque enregistreur de log4j peut être donné un autre appender. En outre, vous pouvez donner un log4j enregistreur de plusieurs appenders (alors qu'il va de l'enregistreur du système, et sur le réseau, par exemple). Vous pouvez même avoir un log4j enregistreur ajouter à un StringBuilder, de sorte que vous pouvez facilement lire ce qui était écrit. Et tandis que Système.peut être redirigé, cette redirection a tendance à être assez limité; le Système.peut être redirigée vers un fichier ou à un tuyau (d'un autre programme), mais vous ne pouvez pas être en mesure de le rediriger vers une URL, par exemple; en revanche, il serait très facile de créer un appender qui transmet des messages de journalisation à l'aide de HTTP POST.
Utiliser, par exemple,
À l'aide de
logger.setLevel(...)
vous pouvez facilement choisir d'afficherlogger.debug(..)
messages, comme par exemple au niveau d'avertir et de toute trace, le débogage et l'info déclarations ne seront pas imprimées. Cela vous permet d'économiser le temps d'avoir à commenter de temps en temps seulement besoin des instructions de débogage.Également jeter un oeil à Wikipedia.
À l'aide de l'enregistreur.setLevel (...), vous pouvez facilement choisir d'affichage de l'enregistreur.debug(..) des messages, comme par exemple au niveau d'avertir et de toute trace, le débogage et l'info déclarations ne seront pas imprimées. Cela vous permet d'économiser le temps d'avoir à commenter de temps en temps seulement besoin des instructions de débogage
Dans le cas de log4j,Il offre un moyen de vaisselle de service où vous pouvez gérer les niveaux d'enregistrement comme DEBUG,INFO,ERREUR etc. Et vous pouvez activer et désactiver la journalisation.Mais dans le cas de Système..println (), vous avez à gérer chaque chose.