Analog zu den in String.format() verwendeten Platzhaltern ‘%s’ möchte ich gerne die bei Log4j bzw Logback verwendeten Zeichen ‘{}’ benutzen. Meine Versuche das programmatisch zu lösen geraten mir zu umfänglich (String.replaceAll("{}","%s") usw.
Deshalb hier meine Frage - gibt es einen einfachen Weg dahin.
Hallo,
wenn es einfach darum geht einen String zu formatieren, kann man die MessageFormat Klasse nehmen:
final String heinz = "Heinz";
final String horst = "Horst";
final String text = MessageFormat.format("Hallo {0}, wo ist {1}?", heinz, horst);
System.out.println(text);
Gruß
[QUOTE=TingelTangel]Hallo,
wenn es einfach darum geht einen String zu formatieren, kann man die MessageFormat Klasse nehmen:
final String heinz = "Heinz";
final String horst = "Horst";
final String text = MessageFormat.format("Hallo {0}, wo ist {1}?", heinz, horst);
System.out.println(text);
Gruß[/QUOTE]
Danke für die Antwort. Es geht mir mehr darum einen eigenen (kleinen!!) Logger zu implementieren ohne mir die Möglichkeit zu nehmen später auf einen Anderen (LOG4J oder Logback) umzusteigen. Deshalb sollen die Statements jetzt schon syntaktisch passen. Falls ich mich entscheide später umzusteigen, dann brauche ich nur die imports auszutauschen.
public static void message(final String level, final Object... message) {
String msg=(String)message[0];
for (int i=1; i<message.length;i++) {
msg=new String(String.format(msg.replaceFirst("\\{\\}","%s"),message**));
}
cl = Calendar.getInstance();
String tstamp = dateform.format(cl.getTime());
if (verboseLevel.compareTo(EnumLoggerLevel.TRACE)<=0) {
String callersName=new Throwable().getStackTrace()[2].getClassName();
System.out.printf("%s %-5s - %s - %s
",tstamp, level, callersName, msg);
}
else {
System.out.printf("%s %-5s - %s
",tstamp, level, msg);
}
}
Ich habe es jetzt so gelöst; meine Hoffnung wäre gewesen, dass es die Unterstützung für ‘{}’ direkt gibt. Wenn ich die Tags erst mit Nummern versehen soll spart mir das gegen meine Lösung nichts ein.
das new String()
scheint jedenfalls überflüssig zu sein,
generell immer mit höchsten Fragezeichen versehen, falls man nicht gerade ein byte[] und ein Charset vorliegen hat
wiederholtes Format, naja,
sofern man die Parameter als eigenes Array hat, gibts noch folgendes:
public class Test3 {
public static void main(String[] args) {
message1("Hallo {}, ich bin {}", "du", "Klaus");
message2("Hallo {}, ich bin {}", "du", "Klaus");
}
public static void message1(final Object... message) {
String msg = (String)message[0];
for (int i = 1; i < message.length; i++) {
msg = new String(String.format(msg.replaceFirst("\\{\\}", "%s"), message**));
}
System.out.println(msg);
}
public static void message2(String msg, final Object... message) {
msg = msg.replaceAll("\\{\\}", "%s");
msg = String.format(msg, message);
System.out.println(msg);
}
}
[QUOTE=SlaterB]
public static void message2(String msg, final Object... message) {
msg = msg.replaceAll("\\{\\}", "%s");
msg = String.format(msg, message);
System.out.println(msg);
}
}
```[/QUOTE]
Die Methode message2 gefällt mir außerordentlich; leider funktioniert es nicht - muss später mal weiterprobieren; jetzt hat meine Frau Aufgaben für mich ;-).
Ich bekomme die Exception
>
> Exception in thread "main" java.lang.NoSuchMethodError: de.gombers.tools.logging.Logger.trace(Ljava/lang/String;[Ljava/lang/Object;)V
ausgeworfen.
public static void trace(final String msg, final Object... message) {
if (loggerLevel.compareTo(EnumLoggerLevel.TRACE)>0) return;
message("TRACE",msg, message);
}
LOGGER.trace(“text … {} …”,insert);
So einen Fehler bekomme ich normalerweise wenn das Hotcodereplacement im Tomcat nicht richtig funktioniert hat, oder eine Klasse doppelt im Classpath in zwei unterschiedlichen Versionen vorhanden ist.
Vielleicht ein Problem mit Generics? Von was für einem Typ ist “insert”?
[QUOTE=TingelTangel]So einen Fehler bekomme ich normalerweise wenn das Hotcodereplacement im Tomcat nicht richtig funktioniert hat, oder eine Klasse doppelt im Classpath in zwei unterschiedlichen Versionen vorhanden ist.
Vielleicht ein Problem mit Generics? Von was für einem Typ ist “insert”?[/QUOTE]
Das war ein Environment-Fehler. Die Klassen sind auf mehrere jars verteilt; und in der Runtime-Umgebung hatte das alte Archiv in der Mache. Die Meldung stimmte also Wort für Wort.
Aber es tut sich ein anderes Ärgernis auf; printf verzeiht es nicht wenn es mehr Platzhalter als Argumente gibt; das gibt eine Exception und gefällt mir nicht besonders. Aber insgesamt bin ich doch einigermaßen zufrieden - danke für die Idee