On Jul 15, 2012, at 7:13 AM, Ralph Goers wrote:

On Jul 15, 2012, at 6:36 AM, Gary Gregory wrote:

Hi All:

I've only now been able to take a peek at v2 in SVN so... sorry for the late email but I feel better late than never.

With log4j 1.2, my usage pattern is:

logger.debug(String.format("This %s and that %d on this day %1$tm %1$te,%1$tY", this, this.getThat(), this.getCalendar()));

In 2.0, we have this example:

logger.debug("Logging in user {} with id {}", user.getName(), user.getId());

Why invent a new syntax when String.format is baked into the JRE? 

Because you are doing the string formatting whether the log event will be logged or not, which means your logger.debug should always be wrapped in an if isDebugEnabled.  Also, the current syntax is compatible with SLF4J. See http://www.slf4j.org/faq.html#logging_performance.

If you want to write your debug message the way you have shown there is nothing that says you can't. It will still work.  However, as I recall Ceki ran tests that showed the Java text formatting is pretty slow.  See http://bugzilla.slf4j.org/show_bug.cgi?id=116 for a nice discussion on this, and related topics.

One other point.  The String with placeholders is handled by ParamaterizedMessage.  This class could either be extended or enhanced to support another syntax. If it is extended then that class would have to be used in the logging call such as

logger.debug(new FormattedMessage("This %s and that %d on this day %1$tm %1$te,%1$tY", this, this.getThat(), this.getCalendar()));

The advantage with the above is that, although a FormattedMessage is created every time the logger.debug statement is executed, it will defer the actual message formatting until the event is logged (i.e. the formatting won't happen if debug logging is disabled).

I should note that you wouldn't be able to add a new Class named FormattedMessage as there is already an interface with that name.