web-dev-qa-db-fra.com

Différence entre slf4j et log4j sur la base de la création de chaînes

Dans log4j si on écrit

**logger.debug("Processing trade with id: " + id + " symbol: " + symbol);**

cela créera String dans le pool de chaînes, mais lorsque nous utilisons slf4j, nous utilisons des paramètres basés comme celui-ci

**logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);**

Alors, quelle est la différence entre ces deux instructions, slf4j créera ou non String au moment de l'exécution?

20
raw

La différence est l'augmentation des performances, dans log4j, la chaîne est concaténée chaque fois que la ligne est évaluée même si le niveau de journal est inférieur au débogage, de sorte que la chaîne ne sera jamais utilisée.

slf4j, la chaîne et les paramètres sont transmis à l'enregistreur qui ne les remplace que si le message de journal doit réellement être utilisé.

Imaginez du code avec des instructions de débogage toutes les quelques lignes, lorsque la production et le débogage sont désactivés, il s'agit d'une énorme quantité de manipulation de chaînes qui ne sera jamais utilisée.

21
dezzer10

Je dirais d'augmenter les performances en réduisant String concatenations.

Quand tu écris ça

"Processing trade with id: " + id + " symbol: " + symbol

Vous créez la chaîne d'impression manuellement.

Quand tu écris

"Processing trade with id: {} and symbol : {} ", id, symbol
                    -------^id------------^symbol---------

Dans un deuxième temps avant d'imprimer en interne slf4j maintenez et générez à nouveau une nouvelle chaîne avec concaténation (N'avez pas vérifié le code source, peut être un StringBuilder).

Le {} appelé comme espaces réservés et remplacé par les arguments passés par vous.

à partir des documents de sl4j

Ce formulaire évite la concaténation de chaînes superflues lorsque l'enregistreur est désactivé pour le niveau DEBUG. Cependant, cette variante entraîne le coût caché (et relativement faible) de la création d'un objet [] avant d'appeler la méthode, même si cet enregistreur est désactivé pour DEBUG. Les variantes prenant un et deux arguments existent uniquement pour éviter ce coût caché.

Lisez comment utiliser le format: Comment utiliser Java.String.format dans Scala?

7
Suresh Atta

SLF4J est essentiellement une couche d'abstraction. Ce n'est pas une implémentation de journalisation. Cela signifie que si vous écrivez une bibliothèque et que vous utilisez SLF4J, vous pouvez donner cette bibliothèque à quelqu'un d'autre à utiliser et ils peuvent choisir l'implémentation de journalisation à utiliser avec SLF4J, par exemple. log4j ou l'API de journalisation Java Java. Elle empêche les projets de dépendre de nombreuses API de journalisation simplement parce qu'elles utilisent des bibliothèques qui en dépendent.

5
Byorn

Avec l'API Log4j2, nous pouvons avoir logger.info ("String: {} int: {}.", "Hello, World", 10);

2
Sagar Mhatre

Alors, quelle est la différence entre ces deux déclarations, slf4j créera String au moment du rhum ou non?

Les chaînes seront de toute façon créées, que vous utilisiez log4j ou sl4j. sl4j offre une commodité d'espace réservé.

1
Santosh

Il s'agit de la concaténation de chaînes. La première ligne oblige toujours String à concaturer cette opération coûteuse, la deuxième ligne n'est pas concat si le niveau du journal ne correspond pas au débogage. Je ne suis pas sûr que la deuxième option de niveau de journal correspondant peut être de meilleures performances en raison de l'utilisation interne de StringBuilder.

0
Erdinç Taşkın