Hi Jonas, On Sep 14, 2008, at 1:27 AM, Jonas von Malottki wrote:
> Hi, > > Vincent Massol wrote: >> On Sep 13, 2008, at 11:30 PM, Jonas von Malottki wrote: >>> >>> Oh, Hibernate now uses slf4j, which I once suggested for use in >>> XWiki >>> (Again it is *not* an implementation, it's just a facade, with >>> plug- able >>> implementations.) >> But we don't need it... We have our own simple facade which can be >> plugged to any logging system including slf4j. >> See >> http://svn.xwiki.org/svnroot/xwiki/platform/core/trunk/xwiki-component/src/main/java/org/xwiki/component/logging/Logger.java > > Ah, seeing this remembered me, that I wanted to introduce one of the > slf4j features: delayed expanding of messages for logging see: > http://n2.nabble.com/Logging-architecture-proposal-tt516791.html#none Ah I had forgotten this email of yours, sorry about that. I've read it again and it seems good to me, especially since our best practice is now to use this: logger.debug(String.format("text with %s in format syntax", var1, var2,...); So I'm +1 for modifying our logger interface to support this style. Actually I even think we should maybe deprecate the old signatures. > I have done a small patch with this now (attachment). Or should I > create a Jira issue? Can you create a jira issue and attach your patch there? Thanks a lot Jonas for pursuing this! -Vincent > An SLF4J Logger implementation is also very easy then. And I can use > it ;). > > Greetings > Jonas > >> I'm completely against replacing it with any external framework >> since those frameworks come and go. As an example the de facto >> standard was log4j a few years ago, then came commons-logging, >> then it was included in the JDK, then now slf4j. Then who knows >> what will happen tomorrow. Our rule is to use our own interface >> for all our core components so that we are independent of such >> changes. >> Thanks >> -Vincent > > Index: core/xwiki-component/src/main/java/org/xwiki/component/ > logging/Logger.java > =================================================================== > --- core/xwiki-component/src/main/java/org/xwiki/component/logging/ > Logger.java (revision 12676) > +++ core/xwiki-component/src/main/java/org/xwiki/component/logging/ > Logger.java (working copy) > @@ -39,17 +39,41 @@ > > void debug( String message ); > > + /** > + * Logs the [EMAIL PROTECTED] message} to the logger while replacing > all > + * '{}' in the message String with the corresponding object > + * from the objects array. Replacing first '{}' by > + * [EMAIL PROTECTED] objects[0].toString()}, second '{}' by > + * [EMAIL PROTECTED] objects[1].toString()} and so forth. > + * </br> > + * Ideally the message should only be expanded and thus the > + * [EMAIL PROTECTED] toString()} be called iff the message is really > > logged. > + * > + * @param message The message to be formatted > + * @param objects The objects to be filled into the message > + */ > + void debug( String message, Object... objects ); > + > void debug( String message, Throwable throwable ); > > boolean isDebugEnabled(); > > void info( String message ); > + > + /** > + * @see Logger.debug(String, Object...) > + * @param message > + * @param objects > + */ > + void info( String message, Object... objects ); > > void info( String message, Throwable throwable ); > > boolean isInfoEnabled(); > > void warn( String message ); > + > + void warn( String message, Object... objects ); > > void warn( String message, Throwable throwable ); > > @@ -57,6 +81,8 @@ > > void error( String message ); > > + void error( String message, Object... objects ); > + > void error( String message, Throwable throwable ); > > boolean isErrorEnabled(); > Index: core/xwiki-plexus/src/main/java/org/xwiki/plexus/logging/ > PlexusLogger.java > =================================================================== > --- core/xwiki-plexus/src/main/java/org/xwiki/plexus/logging/ > PlexusLogger.java (revision 12676) > +++ core/xwiki-plexus/src/main/java/org/xwiki/plexus/logging/ > PlexusLogger.java (working copy) > @@ -26,6 +26,64 @@ > { > private org.codehaus.plexus.logging.Logger logger; > > + private static String expandMessage(String message, Object... > objects){ > + if(message == null) > + return ""; > + if(objects == null ) > + return message; > + int olast = objects.length - 1; > + if(olast == -1) > + return message; > + > + char[] msgchar = message.toCharArray(); > + int mlast = msgchar.length - 1; > + > + StringBuffer sb = new StringBuffer(); > + > + int o = 0; > + > + // iterate through the Object Array and replace '{}' in the > msg > + for(int i = 0; i < mlast; i++) > + { > + if(msgchar[i] == '{' && msgchar[i+1] == '}') > + { > + i++; // the next one can be skipped > + if( o < objects.length ) > + { > + if(objects[o] == null) > + { > + sb.append("(null)"); > + } else { > + sb.append(objects[o].toString()); > + } > + o++; > + } > + } else { > + sb.append(msgchar[i]); > + } > + } > + > + // append last char only if it did not came from a '{}' > + if( !(msgchar[mlast-1] == '{' && msgchar[mlast] == '}') ) > + { > + sb.append(msgchar[mlast]); > + } > + > + if(objects[olast] instanceof Throwable) > + { > + Throwable e = (Throwable)objects[olast]; > + sb.append("\n"); > + for(StackTraceElement se : e.getStackTrace()) > + { > + sb.append(" "); > + sb.append(se.toString()); > + } > + } > + > + return sb.toString(); > + > + } > + > public PlexusLogger(org.codehaus.plexus.logging.Logger logger) > { > this.logger = logger; > @@ -36,6 +94,15 @@ > this.logger.debug(message); > } > > + public void debug(String message, Object... objects) > + { > + // only expand the message if the Debug level is enabled > + if(this.logger.isDebugEnabled()) > + { > + this.logger.debug(expandMessage(message, objects)); > + } > + } > + > public void debug(String message, Throwable throwable) > { > this.logger.debug(message, throwable); > @@ -50,6 +117,15 @@ > { > this.logger.info(message); > } > + > + public void info(String message, Object... objects) > + { > + // only expand the message if the Info level is enabled > + if(this.logger.isInfoEnabled()) > + { > + this.logger.info(expandMessage(message, objects)); > + } > + } > > public void info(String message, Throwable throwable) > { > @@ -65,6 +141,15 @@ > { > this.logger.warn(message); > } > + > + public void warn(String message, Object... objects) > + { > + // only expand the message if the Warn level is enabled > + if(this.logger.isWarnEnabled()) > + { > + this.logger.debug(expandMessage(message, objects)); > + } > + } > > public void warn(String message, Throwable throwable) > { > @@ -81,6 +166,15 @@ > this.logger.error(message); > } > > + public void error(String message, Object... objects) > + { > + // only expand the message if the Error level is enabled > + if(this.logger.isErrorEnabled()) > + { > + this.logger.error(expandMessage(message, objects)); > + } > + } > + > public void error(String message, Throwable throwable) > { > this.logger.error(message, throwable); _______________________________________________ devs mailing list devs@xwiki.org http://lists.xwiki.org/mailman/listinfo/devs