
Hi Dario, Thanks for sharing this code. It's probably a minor detail but instead of switching on a String which requires JDK 7, you could switch on the integer corresponding to a Level. The Level.toInt() method [1] returns this integer. The integer constant for DEBUG is given by Level.DEBUG_INT [2], for INFO by Level.INFO_INT and so forth. BTW, the code for the Levels enum is missing. For future reference, it would be very nice if you could create a github project for this code. Best regards, -- Ceki http://twitter.com/#!/ceki [1] http://logback.qos.ch/apidocs/ch/qos/logback/classic/Level.html#toInt%28%29 [2] http://logback.qos.ch/apidocs/ch/qos/logback/classic/Level.html#DEBUG_INT On 05.06.2012 09:20, Dario Campagna wrote:
Hi all,
Another update regarding the localization of log level names.
I made some modifications to the custom converter for level names localization I implemented following Ceki's suggestion (i.e., CAL10NLevelConverter). The following is the converter I obtained.
public class CAL10NLevelConverter extends ClassicConverter {
private static String LOC_TRACE = locLevelName("TRACE"); private static String LOC_DEBUG = locLevelName("DEBUG"); private static String LOC_INFO = locLevelName("INFO"); private static String LOC_WARN = locLevelName("WARN"); private static String LOC_ERROR = locLevelName("ERROR");
@Override public String convert(ILoggingEvent event) { Level level = event.getLevel();
String locLevelName;
switch (level.toString()) { case "TRACE": locLevelName = LOC_TRACE; break; case "DEBUG": locLevelName = LOC_DEBUG; break; case "INFO": locLevelName = LOC_INFO; break; case "WARN": locLevelName = LOC_WARN; break; case "ERROR": locLevelName = LOC_ERROR; break; default: locLevelName = LOC_DEBUG; }
return locLevelName; }
private static String locLevelName(String levelName) { IMessageConveyor mc = new MessageConveyor(Locale.getDefault());
Enum<Levels> key;
switch (levelName) { case "TRACE": key = Levels.TRACE; break; case "DEBUG": key = Levels.DEBUG; break; case "INFO": key = Levels.INFO; break; case "WARN": key = Levels.WARN; break; case "ERROR": key = Levels.ERROR; break; default: key = Levels.DEBUG; }
return mc.getMessage(key); }
}
Thanks to the static attributes I manged to reduce the number of invocations to the method MakePropertyResourceBoundle of CAL10N when using the custom converters for localizing level names. I also used this idea to implement a custom converter that localize the string "Caller+".
Running my application using this new converter I obtain the same performances in term of execution time I get using logback with modified Level and CallerDataConverter classes.
Cheers, Dario