web-dev-qa-db-fra.com

Quoi de neuf avec la journalisation en Java?

Pourquoi utiliser l'un des packages suivants au lieu de l'autre?

  • Journalisation Java
  • Journalisation de Commons
  • Log4j
  • SLF4j
  • Déconnexion
117
Loki

Dans l'ordre chronologique de l'apparence api (pour autant que je sache):

  • Log4j parce que presque tout le monde l'utilise (d'après mon expérience)
  • Journalisation Commons parce que les projets open source l'utilisent (afin qu'ils puissent s'intégrer à n'importe quel cadre de journalisation utilisé dans la solution intégrée); particulièrement valable si vous êtes un API/Framework/OSS et que vous comptez sur d'autres packages qui utilisent Commons Logging.
  • Journalisation de Commons parce que vous ne voulez pas "verrouiller" à un cadre de journalisation particulier (donc à la place, vous verrouillez ce que Commons Logging vous donne à la place) - Je ne pense pas qu'il soit raisonnable de décider d'utiliser ce point comme raison.
  • Journalisation Java car vous ne voulez pas ajouter de pot supplémentaire.
  • SLF4j car il est plus récent que Commons Logging et fournit une journalisation paramétrée:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Logback car il est plus récent que log4j et encore, prend en charge la journalisation paramétrée, car il implémente SLF4j directement
  • SLF4j/Logback parce que c'est écrit par le même gars qui a fait log4j, donc il l'a amélioré (selon Ken G - merci. Il semble correspondre quand on regarde leurs articles précédents) )
  • SLF4j car ils publient également un adaptateur log4j pour que vous n'ayez pas à "désactiver" log4j dans un code plus ancien - faites simplement log4j.properties utiliser SLF4j et sa configuration
86
Stephen

Je trouve que la connexion Java est source de confusion, incohérente, mal documentée et surtout aléatoire. De plus, il existe une énorme similitude entre ces cadres de journalisation, ce qui entraîne une duplication des efforts et une confusion quant à dans quel environnement de journalisation vous vous trouvez. En particulier, si vous travaillez dans une sérieuse Java, vous êtes souvent dans plusieurs environnements de journalisation à la fois; (par exemple, hibernate peut utiliser log4j et Tomcat Java.util.logging). Apache commons est destiné à relier différents cadres de journalisation, mais ajoute vraiment plus de complexité. Si vous ne le savez pas à l'avance, c'est complètement déroutant. Pourquoi mes messages de journal ne s'impriment pas sur la console, etc.? Ohh parce que je regarde les journaux Tomcat, et non log4j. Ajoutant encore une autre couche de complexité, le serveur d'applications peut avoir des configurations de journalisation globales qui peuvent ne pas reconnaître les configurations locales pour un application Web particulière. Enfin, tous ces journaux f rameworks sont TROP COMPLIQUÉS. Se connecter Java a été un désordre désorganisé, laissant les développeurs comme moi frustrés et confus.

Les premières versions de Java n'avaient pas de cadre de journalisation intégré menant à ce scénario.

36
Julien Chastang

Il y a un point important qui n'a pas été mentionné auparavant:

SLF4J (et Logback et LOG4J en tant que backend de journalisation) prennent en charge un soi-disant contexte de diagnostic mappé (MDC, voir javadoc et documentation ).

Il s'agit essentiellement d'une Map <String, String> locale au thread que vous pouvez utiliser pour ajouter des informations de contexte supplémentaires à votre événement de journalisation. L'état actuel du MDC est attaché à chaque événement.

Cela peut être incroyablement utile si vous y mettez des éléments comme le nom d'utilisateur et l'URL de la demande (dans le cas d'une application Web). Cela peut être fait automatiquement à l'aide d'un filtre, par exemple.

22
Huxi

Voir aussi les réponses à la question Quelles sont les meilleures pratiques pour enregistrer une erreur? , en particulier:

  • Il existe des problèmes potentiels de chargement de classe avec Commons Logging.

  • Log4J et SLF4J ont été développés par la même personne, apprenant des problèmes rencontrés dans la pratique avec Log4J.

17
Ken Gentle

Vue d'ensemble de la journalisation Commons donne la raison de son existence: la journalisation à partir du code de bibliothèque, lorsque vous n'avez aucun contrôle sur le cadre de journalisation sous-jacent. Très important pour les différents projets Apache, qui seront liés à des applications externes. Peut-être pas si important pour les projets informatiques internes, où vous avez un contrôle complet.

Cela dit, j'écris à Commons Logging, comme le font de nombreux autres développeurs que je connais. La raison est de minimiser le bagage mental: vous pouvez changer de projets ou d'emplois, et ne pas avoir à apprendre un nouveau cadre (à condition que le nouveau travail/projet utilise également CL, et/ou vous pouvez les convaincre de passer à lui).

En outre, il est utile de créer vos propres wrappers autour du cadre que vous utilisez. Comme décrit ici , j'aime utiliser un objet LogWrapper pour fournir une stringification personnalisée (important) et minimiser l'encombrement visuel des instructions de journalisation (moins important).

4
kdgregory

Dans notre projet d'entreprise, nous utilisons LOG4j et il est très facile à utiliser comme Stephen l'a montré dans son exemple. Nous avons également écrit nos propres classes de modèles pour LOG4j afin que vous puissiez créer vos propres schémas de fichiers de sortie. Vous pouvez décrire à quoi devrait ressembler votre fichier journal. Il est possible d'améliorer les classes log4j d'origine.

Toutes les propriétés LOG4j que vous pouvez modifier dans un fichier log4j.properties, vous pouvez donc utiliser différents fichiers pour différents projets.

La journalisation Java n'est pas mon préféré, mais cela pourrait être dû au fait que j'utilise log4j depuis le début.

4
Markus Lausberg

En général, j'utiliserais par défaut Log4J.

J'utiliserais Java Logging si cela ne me dérangeait pas une dépendance à Java 1.4 mais j'utiliserais toujours Log4J de préférence.

J'utiliserais Commons Logging si j'améliorais quelque chose qui l'utilisait déjà.

2
Michael Rutherfurd

Je suggérerais de créer une façade de journalisation mince qui peut écrire dans n'importe quel cadre de journalisation, à quel point le choix du moteur de support devient à peu près un point discutable.

0
tsimon