web-dev-qa-db-fra.com

Formatage implicite des chaînes Log4j

J'utilise log4j v1.2.14 pour me connecter à mon projet et j'utilise également Java 7String.format () pour mettre des variables dans ma sortie. Actuellement j'écris

LOGGER.info(String.format("Your var is [%s] and you are [%s]", myVar, myVar1));

Est-ce vraiment la meilleure façon de produire des chaînes? Je sens ça log4j devrait implémenter cela implicitement comme ci-dessous:

LOGGER.info("Your var is [%s] and you are [%s]", myVar, myVar1);

Ai-je raté quelque chose? De plus, existe-t-il des cadres de journalisation Java qui prennent en charge cela?

23
Rossiar

L'API de slf4j fournit " la journalisation paramétrée ", qui vous permet de faites exactement cela, bien qu'avec une syntaxe légèrement différente. L'exemple il y a:

logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);

Pour une implémentation, vous pouvez utiliser Logback qui implémente slf4j en mode natif, ou les liaisons slf4j pour vous connecter à log4j ou à d'autres enregistreurs. Le manuel de l'utilisateur explique cela, ainsi qu'un court exemple.

33
Yosef Weiner

En utilisant String.format, +, ou un formateur de chaînes autre que celui fourni par votre système de journalisation (log4j par exemple) est considéré comme une mauvaise pratique. Habituellement, dans le code, il y a beaucoup de journaux de bas niveau (débogage, informations) que vous ne voulez pas voir en production. Si vous utilisez par exemple String.format pour formater la chaîne à enregistrer, vous allez alors générer et formater une nouvelle chaîne qui peut être très longue et consommer des ressources, même si à la fin rien ne sera journalisé (par exemple si le log4j le niveau min est défini sur avertissement ou erreur). En utilisant le système de formatage de l'enregistreur (comme celui de log4j), vous autorisez votre enregistreur à éviter la génération de la chaîne formatée si elle n'a pas besoin d'être enregistrée.

Cela peut faire une grande différence dans certains cas.

5
Mathieu

Log4j prend en charge le formatage interne. Je ne l'ai trouvé nulle part, mais j'en ai vu un exemple ici:

https://logging.Apache.org/log4j/2.x/manual/markers.html

Je l'ai essayé et ça marche! Je suis sur log4j 2.11.2.

int i = 42;
String str1 = "the answer";
String str2 = "life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);

En regardant le javadoc pour Logger, je dirais qu'il a été introduit dans Lo4j 2 et prend en charge jusqu'à 10 paramètres.

https://logging.Apache.org/log4j/2.x/log4j-api/apidocs/org/Apache/logging/log4j/Logger.html

1
bobanahalf

Btw, dans ce scénario, il n'y a pas beaucoup de différence entre utiliser + Pour ajouter vos variables à la chaîne et String.format - sauf si vous voulez vraiment réutiliser le "Votre var est ..." en tout vos journaux.

slf4j vous permet de vous connecter en tant que

log.info("Your var is {} and you are {}", myVar, myVar1);

Notez l'utilisation de {} Au lieu de formateurs d'impression. Cela nécessite également Java> = 1.5

0
ring bearer