
Author: ceki Date: Thu Oct 30 22:16:06 2008 New Revision: 1922 Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Log: Lazy initialization of formattedMessage as suggested in LBCLASSIC-47 Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Thu Oct 30 22:16:06 2008 @@ -29,13 +29,11 @@ * is made to log then a <code>LoggingEvent</code> instance is created. This * instance is passed around to the different Logback components. * - * <p> - * Writers of Logback components such as appenders should be aware of that some - * of the LoggingEvent fields are initialized lazily. Therefore, an appender - * wishing to output data to be later correctly read by a receiver, must - * initialize "lazy" fields prior to writing them out. See the - * {@link #prepareForDeferredProcessing()} method for the exact list. - * </p> + * <p> Writers of Logback components such as appenders should be aware of that + * some of the LoggingEvent fields are initialized lazily. Therefore, an + * appender wishing to output data to be later correctly read by a receiver, + * must initialize "lazy" fields prior to writing them out. See the + * {@link #prepareForDeferredProcessing()} method for the exact list. </p> * * @author Ceki Gülcü * @author Sébastien Pennec @@ -46,7 +44,7 @@ private static final int NULL_ARGUMENT_ARRAY = -1; private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT"; - + /** * */ @@ -56,8 +54,7 @@ * Fully qualified name of the calling Logger class. This field does not * survive serialization. * - * <p> - * Note that the getCallerInformation() method relies on this fact. + * <p> Note that the getCallerInformation() method relies on this fact. */ transient String fqnOfLoggerClass; @@ -69,16 +66,14 @@ /** * Level of logging event. * - * <p> - * This field should not be accessed directly. You shoud use the {@link - * #getLevel} method instead. - * </p> + * <p> This field should not be accessed directly. You shoud use the {@link + * #getLevel} method instead. </p> * */ private transient Level level; private String message; - private String formattedMessage; + private transient String formattedMessage; private transient Object[] argumentArray; @@ -114,11 +109,6 @@ // bug 85 (we previously failed to set this.argumentArray) this.argumentArray = argArray; - if (argArray != null) { - formattedMessage = MessageFormatter.arrayFormat(message, argArray); - } else { - formattedMessage = message; - } timeStamp = System.currentTimeMillis(); // the case is ugly but under the circumstances acceptable @@ -151,9 +141,9 @@ /** * @param threadName - * The threadName to set. + * The threadName to set. * @throws IllegalStateException - * If threadName has been already set. + * If threadName has been already set. */ public void setThreadName(String threadName) throws IllegalStateException { if (this.threadName != null) { @@ -175,8 +165,7 @@ */ public void setThrowableProxy(ThrowableProxy tp) { if (throwableProxy != null) { - throw new IllegalStateException( - "ThrowableProxy has been already set."); + throw new IllegalStateException("ThrowableProxy has been already set."); } else { throwableProxy = tp; } @@ -186,9 +175,8 @@ * This method should be called prior to serializing an event. It should also * be called when using asynchronous logging. * - * <p> - * Note that due to performance concerns, this method does NOT extract caller - * data. It is the responsability of the calller to extract caller + * <p> Note that due to performance concerns, this method does NOT extract + * caller data. It is the responsability of the calller to extract caller * information. */ public void prepareForDeferredProcessing() { @@ -246,10 +234,8 @@ * null at the time of its invocation, this method extracts location * information. The collected information is cached for future use. * - * <p> - * Note that after serialization it is impossible to correctly extract caller - * information. - * </p> + * <p> Note that after serialization it is impossible to correctly extract + * caller information. </p> */ public CallerData[] getCallerData() { // we rely on the fact that fqnOfLoggerClass does not survive @@ -276,7 +262,19 @@ this.marker = marker; } + // computer formatted lazy as suggested in + // http://jira.qos.ch/browse/LBCLASSIC-47 public String getFormattedMessage() { + if (formattedMessage != null) { + return formattedMessage; + } + + if (argumentArray != null) { + formattedMessage = MessageFormatter.arrayFormat(message, argumentArray); + } else { + formattedMessage = message; + } + return formattedMessage; }