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 12680)
+++ core/xwiki-component/src/main/java/org/xwiki/component/logging/Logger.java	(working copy)
@@ -37,28 +37,173 @@
         /** Typecode for disabled log levels. */
         int LEVEL_DISABLED = 5;
 
+        /**
+         * @param message to be logged to debug
+         */
         void debug( String message );
-
+        
+        /**
+         * @param message to be logged to debug
+         * @param throwable Throwable associated with the message for 
+         * stacktrace output
+         */
         void debug( String message, Throwable throwable );
+        
+        /**
+         * Logs the {@code message} to the logger with debug priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param objects The objects to be filled into the message
+         */
+        void debug( String message, Object... objects );
 
+        /**
+         * Logs the {@code message} to the logger with debug priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param throwable Throwable associated with the message for stacktrace output
+         * @param objects The objects to be filled into the message
+         */
+        void debug( String message, Throwable throwable, Object... objects );
+        
+        /**
+         * @return {@code true} if messages will be logged to debug
+         */
         boolean isDebugEnabled();
 
+        /**
+         * @param message to be logged to info
+         */
         void info( String message );
-
+        
+        /**
+         * @param message to be logged to info
+         * @param throwable Throwable associated with the message for 
+         * stacktrace output
+         */
         void info( String message, Throwable throwable );
+        
+        /**
+         * Logs the {@code message} to the logger with info priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param objects The objects to be filled into the message
+         */
+        void info( String message, Object... objects );
 
+        /**
+         * Logs the {@code message} to the logger with info priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param throwable Throwable associated with the message for stacktrace output
+         * @param objects The objects to be filled into the message
+         */
+        void info( String message, Throwable throwable, Object... objects );
+        
+        /**
+         * @return {@code true} if messages will be logged to info
+         */
         boolean isInfoEnabled();
 
+
+        /**
+         * @param message to be logged to warn
+         */
         void warn( String message );
-
+        
+        /**
+         * @param message to be logged to warn
+         * @param throwable Throwable associated with the message for 
+         * stacktrace output
+         */
         void warn( String message, Throwable throwable );
+        
+        /**
+         * Logs the {@code message} to the logger with warn priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param objects The objects to be filled into the message
+         */
+        void warn( String message, Object... objects );
 
+        /**
+         * Logs the {@code message} to the logger with warn priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param throwable Throwable associated with the message for stacktrace output
+         * @param objects The objects to be filled into the message
+         */
+        void warn( String message, Throwable throwable, Object... objects );
+        
+        /**
+         * @return {@code true} if messages will be logged to warn
+         */
         boolean isWarnEnabled();
 
+        /**
+         * @param message to be logged to error
+         */
         void error( String message );
-
+        
+        /**
+         * @param message to be logged to error
+         * @param throwable Throwable associated with the message for 
+         * stacktrace output
+         */
         void error( String message, Throwable throwable );
+        
+        /**
+         * Logs the {@code message} to the logger with error priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param objects The objects to be filled into the message
+         */
+        void error( String message, Object... objects );
 
+        /**
+         * Logs the {@code message} to the logger with error priority while 
+         * expanding the message with the objects passed. The message uses the 
+         * {@link java.util.Formatter} format String Syntax. Most commonly
+         * {@code %s} for {@code obj.toString()} will be used. The logged 
+         * message should only be build if the message is really logged.
+         * 
+         * @param message The message to be formatted via {@code String.format()}
+         * @param throwable Throwable associated with the message for stacktrace output
+         * @param objects The objects to be filled into the message
+         */
+        void error( String message, Throwable throwable, Object... objects );
+
+        /**
+         * @return {@code true} if messages will be logged to error
+         */
         boolean isErrorEnabled();
 
         Logger getChildLogger( String name );
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 12680)
+++ core/xwiki-plexus/src/main/java/org/xwiki/plexus/logging/PlexusLogger.java	(working copy)
@@ -26,6 +26,47 @@
 {
     private org.codehaus.plexus.logging.Logger logger;
 
+    /**
+     * Formats the message like {@code String.format(String, Object...)} but 
+     * also checks for Exceptions and catches the as logging should be robust
+     * and not interfere with normal program flow. The Exception caught will be
+     * passed to the loggers debug output.
+     * 
+     * @param message message in Formatter format syntax
+     * @param objects Objects to fill in 
+     * @return the formatted String if possible, else the message and all 
+     * objects concatenated.
+     */
+    private String formatMessage(String message, Object... objects ){
+        try
+        {
+            return String.format(message, objects);
+        }
+        catch (Exception e)
+        {
+            this.logger.debug("Caught exception while formatting logging message: " + message, e);
+
+            // Try to save the message and just append the passed objects
+            if(objects != null)
+            {
+                StringBuffer sb = new StringBuffer(message);
+                for(Object object : objects)
+                {
+                    if( object != null ){
+                        sb.append(object);
+                    }
+                    else
+                    { 
+                        sb.append("(null)");
+                    }
+                    sb.append(" ");
+                }
+                return sb.toString();
+            }
+            return message;
+        }
+    }
+    
     public PlexusLogger(org.codehaus.plexus.logging.Logger logger)
     {
         this.logger = logger;
@@ -41,6 +82,22 @@
         this.logger.debug(message, throwable);
     }
 
+    public void debug(String message, Object... objects)
+    {
+        if(this.logger.isDebugEnabled())
+        {
+            this.logger.debug(formatMessage(message, objects));
+        }
+    }
+       
+    public void debug(String message, Throwable throwable, Object... objects)
+    {
+        if(this.logger.isDebugEnabled())
+        {
+            this.logger.debug(formatMessage(message, objects), throwable);
+        }
+    }
+
     public boolean isDebugEnabled()
     {
         return this.logger.isDebugEnabled();
@@ -55,7 +112,24 @@
     {
         this.logger.info(message, throwable);
     }
+    
+    public void info(String message, Object... objects)
+    {
+        if(this.logger.isInfoEnabled())
+        {
+            this.logger.info(formatMessage(message, objects));
+        }
+    }
 
+    public void info(String message, Throwable throwable, Object... objects)
+    {
+        if(this.logger.isInfoEnabled())
+        {
+            this.logger.info(formatMessage(message, objects), throwable);
+        }
+    }
+    
+
     public boolean isInfoEnabled()
     {
         return this.logger.isInfoEnabled();
@@ -65,12 +139,28 @@
     {
         this.logger.warn(message);
     }
-
+    
     public void warn(String message, Throwable throwable)
     {
         this.logger.warn(message, throwable);
     }
+        
+    public void warn(String message, Object... objects)
+    {
+        if(this.logger.isWarnEnabled())
+        {
+            this.logger.warn(formatMessage(message, objects));
+        }
+    }
 
+    public void warn(String message, Throwable throwable, Object... objects)
+    {
+        if(this.logger.isWarnEnabled())
+        {
+            this.logger.warn(formatMessage(message, objects), throwable);
+        }
+    }
+
     public boolean isWarnEnabled()
     {
         return this.logger.isWarnEnabled();
@@ -86,6 +176,23 @@
         this.logger.error(message, throwable);
     }
 
+    public void error(String message, Object... objects)
+    {
+        if(this.logger.isErrorEnabled())
+        {
+            this.logger.error(formatMessage(message, objects));
+        }
+    }
+    
+    public void error(String message, Throwable throwable, Object... objects)
+    {
+        if(this.logger.isErrorEnabled())
+        {
+            this.logger.error(formatMessage(message, objects), throwable);
+        }
+    }
+
+    
     public boolean isErrorEnabled()
     {
         return this.logger.isErrorEnabled();
