Con sl4fj si quiero construir un mensaje de cadena no es un buen enfoque en el que se hace uso de sustituciones. Por ejemplo, podría ser algo como:

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

Si hay más de un par de sustituciones necesarias, a continuación, que es algo así como:

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

Mi pregunta es: ¿hay un genérico manera para mí para crear una cadena (y no sólo un slf4j mensaje de registro)? Algo así como:

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

o

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

Si es en el estándar de la biblioteca de Java, lo que haría que «someMethod» ser?

  • Gracias a los que con las respuestas a continuación. Además, he descubierto esta cuestión ya había sido pedido aquí: stackoverflow.com/questions/3114021. Siento haber publicado una manera más o menos duplicado.
InformationsquelleAutor kmccoy | 2011-02-20

5 Comentarios

  1. 100

    De la cadena.formato

    String str = String.format("Action %s occured on object %s.",
       objectA.getAction(), objectB);

    O

    String str = String.format("Action %s occured on object %s with outcome %s.",
       new Object[]{objectA.getAction(), objectB, outcome});

    También puede utilizar numérico de la posición, por ejemplo, para cambiar los parámetros en torno a:

    String str = String.format("Action %2$s occured on object %1$s.",
       objectA.getAction(), objectB);
  2. 41

    Puede utilizar De la cadena.formato o MessageFormat.formato

    E. g.,

    MessageFormat.format("A sample value {1} with a sample string {0}", 
        new Object[] {"first", 1});

    o simplemente

    MessageFormat.format("A sample value {1} with a sample string {0}", "first", 1);
    • MessageFormat es muy versátil y potente, pero para los simples sustituciones de cadenas.formato probablemente será más sencillo y menos restringido (por ejemplo, MessageFormat requiere comillas simples para ser duplicado).
    • new Integer(1) sustituido con sólo 1 de arriba, a continuación, demasiado trabajo.
  3. 24

    Si usted está buscando una solución en la que se puede reemplazar un montón de variables en una Cadena con los valores, puede utilizar StrSubstitutor.

     Map<String, String> valuesMap = new HashMap<>();
     valuesMap.put("animal", "quick brown fox");
     valuesMap.put("target", "lazy dog");
     String templateString = "The ${animal} jumped over the ${target}.";
     StrSubstitutor sub = new StrSubstitutor(valuesMap);
     String resolvedString = sub.replace(templateString);

    Sigue una forma generalmente aceptada, donde uno puede pasar un mapa con las variables a los valores, junto con la resolución de la Cadena y devuelve un resuelto Cadena.

  4. 15

    Yo sugeriría usar org.slf4j.los ayudantes.MessageFormatter. Con la ayuda de que se puede crear un utillity método que utiliza el mismo estilo de formato como slf4j:

    //utillity method to format like slf4j
    public static String format(String msg, Object... objs) {
        return MessageFormatter.arrayFormat(msg, objs).getMessage();
    }
    
    //example usage
    public static void main(String[] args) {
        String msg = format("This msg is {} like slf{}j would do. {}", "formatted", 4,
                new Exception("Not substituted into the message"));
    
        //prints "This msg is formatted like slf4j would do. {}"    
        System.out.println(msg); 
    }

    Nota: Si el último objeto en la matriz es una Excepción, no será sustituido en el mensaje, al igual que con un slf4j registrador. La Excepción sería accesible a través de MessageFormatter.arrayFormat(msg, objs).getThrowable().

    • Yo diría que este no es un buen propósito general de respuesta, pero en realidad bastante hasta el punto de lo que se les pide, sin embargo.
    • Me parece que este es exactamente la respuesta correcta. Este debe ser el mejor en términos de rendimiento.
    • Mejor respuesta ya que utiliza la sintaxis exacta de la pregunta para.
  5. 0

    Yo elija ajustar el Log4j2 ParameterizedMessage que fue originalmente escrito para Lilith por Joern Huxhorn:

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

    Es centrarse en formato de mensaje, a diferencia de SLF4J MessageFormatter que contiene el procesamiento innecesario de Arrojadiza.

    Ver el Javadoc:

    Maneja los mensajes que consisten en una cadena de formato contiene ‘{}’ para representar a cada reemplazable por el token, y los parámetros.

Dejar respuesta

Please enter your comment!
Please enter your name here