100 votes

Y a-t-il une fonction de substitution de chaîne générale similaire à sl4fj ?

Avec sl4fj, si je veux construire un message de chaîne, il existe une approche agréable qui utilise les substitutions. Par exemple, cela pourrait ressembler à :

logger.info("Action {} occurred on object {}.", objectA.getAction(), objectB);

S'il y a plus de quelques substitutions requises, cela ressemble à :

logger.info("Action {} occurred on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});

Ma question est : existe-t-il un moyen générique pour moi de créer une chaîne (et pas seulement un message de journal slf4j) ? Quelque chose comme :

String str = someMethod("Action {} occurred on object {}.", objectA.getAction(), objectB);

ou

String str = someMethod("Action {} occurred on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});

Si c'est dans la bibliothèque standard Java, quel serait ce "someMethod" ?

130voto

The Scrum Meister Points 17215

String.format

String str = String.format("Action %s est survenu sur l'objet %s.",
   objectA.getAction(), objectB);

Ou

String str = String.format("Action %s est survenu sur l'objet %s avec le résultat %s.",
   new Object[]{objectA.getAction(), objectB, outcome});

Vous pouvez également utiliser des positions numériques, par exemple pour inverser les paramètres :

String str = String.format("Action %2$s est survenu sur l'objet %1$s.",
   objectA.getAction(), objectB);

47voto

Johan Sjöberg Points 20759

Vous pouvez utiliser String.format ou MessageFormat.format

Par exemple,

MessageFormat.format("Une valeur d'exemple {1} avec une chaîne d'exemple {0}", 
    new Object[] {"premier", 1});

ou simplement

MessageFormat.format("Une valeur d'exemple {1} avec une chaîne d'exemple {0}", "premier", 1);

29voto

Pete Points 425

Je suggérerais d'utiliser org.slf4j.helpers.MessageFormatter. Avec son aide, on peut créer une méthode utilitaire qui utilise le même style de formatage que slf4j:

// méthode utilitaire pour formater comme slf4j
public static String format(String msg, Object... objs) {
    return MessageFormatter.arrayFormat(msg, objs).getMessage();
}

// exemple d'utilisation
public static void main(String[] args) {
    String msg = format("Ce message est {} comme le ferait slf{}j. {}", "formaté", 4,
            new Exception("Non substitué dans le message"));

    // affiche "Ce message est formaté comme le ferait slf4j. {}"    
    System.out.println(msg); 
}

Remarque: Si le dernier objet dans le tableau est une exception, elle ne sera pas substituée dans le message, tout comme avec un journal slf4j. L'exception serait accessible via MessageFormatter.arrayFormat(msg, objs).getThrowable().

28voto

Si vous recherchez une solution où vous pouvez remplacer un tas de variables dans une chaîne par des valeurs, vous pouvez utiliser StrSubstitutor.

 Map valuesMap = new HashMap<>();
 valuesMap.put("animal", "quick brown fox");
 valuesMap.put("target", "lazy dog");
 String templateString = "Le ${animal} a sauté par-dessus le ${target}.";
 StrSubstitutor sub = new StrSubstitutor(valuesMap);
 String resolvedString = sub.replace(templateString);

Cela suit un modèle généralement accepté où l'on peut passer une carte avec des variables aux valeurs ainsi que la chaîne non résolue et cela renvoie une chaîne résolue.

2voto

zhouji Points 1050

J'ai choisi d'encapsuler le ParameterizedMessage de Log4j2 qui a été initialement écrit pour Lilith par Joern Huxhorn:

public static String format(final String messagePattern, Object... arguments) {
    return ParameterizedMessage.format(messagePattern, arguments);
}

Cela se concentre sur le format du message, contrairement au MessageFormatter de SLF4J qui contient un traitement inutile des Throwable.

Voir la documentation Javadoc:

Gère les messages composés d'une chaîne de format contenant '{}' pour représenter chaque jeton remplaçable, ainsi que les paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X