FELIX-2443: MDC information on logging events can't be displayed in the console

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@957440 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.cfg b/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.cfg
index 5025a17..39437d0 100644
--- a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.cfg
+++ b/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.cfg
@@ -19,4 +19,4 @@
 
 #
 size = 500
-pattern = %d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+pattern = %d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
diff --git a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/VmLogAppender.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/VmLogAppender.java
index 5cffacd..cb67733 100644
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/VmLogAppender.java
+++ b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/VmLogAppender.java
@@ -38,6 +38,7 @@
 
     public void doAppend(PaxLoggingEvent event) {
         if (events != null) {
+            event.getProperties(); // ensure MDC properties are copied
             events.add(event);
         }
     }
diff --git a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java
index ed6f4e6..f6507f8 100644
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java
+++ b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java
@@ -18,7 +18,9 @@
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.Map;
 
 import org.apache.log4j.spi.LoggingEvent;
 import org.ops4j.pax.logging.spi.PaxLocationInfo;
@@ -344,12 +346,12 @@
       pc = new BasicPatternConverter(formattingInfo, NDC_CONVERTER);
       //LogLog.debug("NDC converter.");
       currentLiteral.setLength(0);
-      break;
+      break;*/
     case 'X':
       String xOpt = extractOption();
       pc = new MDCPatternConverter(formattingInfo, xOpt);
       currentLiteral.setLength(0);
-      break;*/
+      break;
     default:
       //LogLog.error("Unexpected char [" +c+"] at position "+i+" in conversion patterrn.");
       pc = new LiteralPatternConverter(currentLiteral.toString());
@@ -523,5 +525,43 @@
       return event.getLoggerName();
     }
   }
+
+  private class MDCPatternConverter extends PatternConverter {
+    String key;
+
+    MDCPatternConverter(FormattingInfo formattingInfo, String key) {
+      super(formattingInfo);
+      this.key = key;
+    }
+
+    public
+    String convert(PaxLoggingEvent event) {
+        if (key == null) {
+            StringBuffer buf = new StringBuffer("{");
+            Map properties = event.getProperties();
+            if (properties.size() > 0) {
+              Object[] keys = properties.keySet().toArray();
+              Arrays.sort(keys);
+              for (int i = 0; i < keys.length; i++) {
+                  buf.append('{');
+                  buf.append(keys[i]);
+                  buf.append(',');
+                  buf.append(properties.get(keys[i]));
+                  buf.append('}');
+              }
+            }
+            buf.append('}');
+            return buf.toString();
+        } else {
+          Object val = event.getProperties().get(key);
+          if(val == null) {
+              return null;
+          } else {
+              return val.toString();
+          }
+        }
+    }
+
+  }
 }