web-dev-qa-db-fra.com

Pouvons-nous utiliser toutes les fonctionnalités de log4j2 si nous l'utilisons avec l'api slf4j?

Nous avons migré tout notre code pour utiliser l'API slf4 pour utiliser des API génériques, mais nous envisageons maintenant de passer de log4j 1.x à log4j 2.x. Pourrons-nous utiliser toutes les fonctionnalités de log4j2 si nous utilisons l'API slf4j et log4j2 comme implémentation?

18
Mayur

L'API Log4j2 est plus riche que l'API SLF4J, et de nombreuses fonctionnalités de l'API Log4j2 sont pas accessibles via SLF4J. Voir ci-dessous pour plus de détails.

Les fonctionnalités de l'implémentation Log4j2, telles que les enregistreurs asynchrones, les recherches, les filtres, les mises en page et les annexes, sont contrôlées avec la configuration et sont disponibles quelle que soit l'API de journalisation que vous utilisez dans votre application.

Veuillez également voir ceci réponse à la question différente mais connexe de pourquoi il est sûr de programmer avec l'API Log4j2.

10 fonctionnalités de l'API Log4j2 non disponibles dans SLF4J

(1) Message API permet aux applications d'enregistrer des objets structurés en plus du texte. En interne, Log4j2 convertit tout ce qui est enregistré dans un message, et l'exposer à l'API ouvre toutes sortes de possibilités pour que les applications interagissent avec les composants de journalisation en aval (filtres, dispositions, annexes). Cela peut être utile si vous développez des composants personnalisés en tant que plugins pour Log4j2, ainsi que lorsque vous utilisez ceux intégrés. Pour un exemple intégré, voyez comment StructuredDataMessage est utilisé pour un contrôle fin sur Rfc5424Layout .

(2) Java 8 prise en charge lambda vous permet de créer paresseusement des paramètres ou des messages de journal sans vérifier explicitement si le niveau de journal demandé est activé.

// Java-8 style optimization: no need to explicitly check the log level:
// the lambda expression is not evaluated if the TRACE level is not enabled
logger.trace("Some long-running operation returned {}", () -> expensiveOperation());

(3) Mélange de paramètres de style {} avec des paramètres de style String :: format %s %d. Le style {} offre de meilleures performances et peut être utilisé avec n'importe quel type de paramètre, mais le style printf donne un contrôle fin sur la mise en forme. Log4j2 vous permet de mélanger facilement ces styles de paramètres. Par exemple:

logger.debug("Opening connection to {}...", someDataSource);
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());

(4) CloseableThreadContext offre une commodité supplémentaire par rapport au ThreadContext (MDC) normal dans SLF4J: il supprime automatiquement les éléments lorsque vous avez terminé. Par exemple:

// Add to the ThreadContext map for this try block only;
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext
        .put("id", UUID.randomUUID().toString())
        .put("loginId", session.getAttribute("loginId"))) {
    logger.debug("Message 1");
    // call some other code that also does logging 
    ...
    logger.debug("Message 2");
    ...
} // "id" and "loginId" are now removed from the ThreadContext map

(5) Log4j2 ThreadContext , en plus des paires clé-valeur, a également des méthodes Push et pop pour prendre en charge la fonctionnalité de pile (ce qui était appelé NDC dans Log4j 1).

(6) SLF4J ne prend pas en charge le niveau de journal FATAL.

(7) Log4j2 prend en charge niveaux de journalisation personnalisés . Ceux-ci peuvent être utilisés avec les méthodes log, par exemple: logger.log(Level.getLevel("FINE"), "... msg"), ou vous pouvez générer un wrapper d'enregistreur personnalisé avec des méthodes pratiques pour vos niveaux de journal personnalisés.

(8) L'API Log4j2 accepte n'importe quel objet, pas seulement des chaînes. C'est l'une des choses qui permettent à Log4j2 d'être " sans ordures ", ce qui signifie qu'il évitera d'allouer de nouveaux objets. Votre objet est enregistré sans créer de chaînes temporaires s'il s'agit d'un nombre, d'une séquence de caractères ou lorsqu'il implémente l'interface (Log4j2) StringBuilderFormattable.

L'API Log4j2 évitera également de créer des tableaux vararg si vous enregistrez 10 paramètres ou moins. SLF4J crée des tableaux vararg si vous enregistrez plus de 2 paramètres.

(9) Ce qui précède est gratuit uniquement en utilisant directement l'API Log4j2. En plus de cela, si vous vous souciez vraiment d'éviter de créer des objets temporaires (comme le font certains jeux interactifs et applications financières à faible latence), vous pouvez éviter les paramètres primitifs de boxe automatique avec la classe d'utilitaire nbox .

(10) L'utilisation par les marqueurs SLF4J de la synchronisation à granularité grossière peut avoir un impact sur les performances des applications multithreads ( SLF4J-24 ). Voir la section Filtrage avancé de cette page résultats des tests de performances .


Avertissement: je contribue à Log4j2.

46
Remko Popma