Index: src/site/xdoc/manual/layouts.xml.vm
===================================================================
--- src/site/xdoc/manual/layouts.xml.vm	(revision 1517757)
+++ src/site/xdoc/manual/layouts.xml.vm	(working copy)
@@ -365,9 +365,9 @@
             </tr>
             <tr>
               <td align="center">
-                <b>ex</b>{["none"|"short"|"full"|depth]}<br />
-                <b>exception</b>{["none"|"short"|"full"|depth]}<br />
-                <b>throwable</b>{["none"|"short"|"full"|depth]}
+                <b>ex</b>{["none"|"short"|"short.className"|"short.fileName"|"short.lineNumber"|"short.methodName"|"short.message"|"full"|depth]}<br />
+                <b>exception</b>{["none"|"short"|"short.className"|"short.fileName"|"short.lineNumber"|"short.methodName"|"short.message"|"full"|depth]}<br />
+                <b>throwable</b>{["none"|"short"|"short.className"|"short.fileName"|"short.lineNumber"|"short.methodName"|"short.message"|"full"|depth]}
               </td>
               <td>
                 <p>Outputs the Throwable trace that has been bound to the LoggingEvent, by
@@ -375,8 +375,13 @@
                   Throwable.printStackTrace().
                   The throwable conversion word can be followed by an option in the form
                   <b>%throwable{short}</b>
-                  which will only output the first line of the Throwable or <b>%throwable{n}</b> where
-                  the first n lines of the stacktrace will be printed. Specifying <b>%throwable{none}</b>
+                  which will only output the first line of the Throwable
+                  <b>%throwable{short.className}</b> which will only output the name of the class where the exception occured,
+                  <b>%throwable{short.methodName}</b> which will print the method name where the exception occured,
+                  <b>%throwable{short.fileName}</b> which will write out the name of the class where the exception occured,
+                  <b>%throwable{short.lineNumber}</b> which will output the line number where the exception occured,
+                  <b>%throwable{short.message}</b> which will print the message, what the exception contains or
+                  <b>%throwable{n}</b> where the first n lines of the stacktrace will be printed. Specifying <b>%throwable{none}</b>
                   or <b>%throwable{0}</b> will suppress printing of the exception.
                 </p>
               </td>
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java	(revision 0)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java	(working copy)
@@ -0,0 +1,73 @@
+package org.apache.logging.log4j.core.pattern;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ThrowablePatternConverterTest {
+
+    @Test
+    public void testFileName() {
+        final String[] options = { "short.fileName" };
+        final ThrowablePatternConverter converter = ThrowablePatternConverter.newInstance(options);
+        final Throwable cause = new NullPointerException("null pointer");
+        final Throwable parent = new IllegalArgumentException("IllegalArgument", cause);
+        final LogEvent event = new Log4jLogEvent("testLogger", null, this.getClass().getName(), Level.DEBUG,
+                new SimpleMessage("test exception"), parent);
+        final StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        final String result = sb.toString();
+        assertEquals("The file names should be same", "ThrowablePatternConverterTest.java", result);
+    }
+
+    @Test
+    public void testClassName() {
+        final String packageName = "org.apache.logging.log4j.core.pattern.";
+        final String[] options = { "short.className" };
+        final ThrowablePatternConverter converter = ThrowablePatternConverter.newInstance(options);
+        final Throwable cause = new NullPointerException("null pointer");
+        final Throwable parent = new IllegalArgumentException("IllegalArgument", cause);
+        final LogEvent event = new Log4jLogEvent("testLogger", null, this.getClass().getName(), Level.DEBUG,
+                new SimpleMessage("test exception"), parent);
+        final StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        final String result = sb.toString();
+        assertEquals("The class names should be same", packageName + "ThrowablePatternConverterTest", result);
+    }
+
+    @Test
+    public void testMethodName() {
+        final String[] options = { "short.methodName" };
+        final ThrowablePatternConverter converter = ThrowablePatternConverter.newInstance(options);
+        final Throwable cause = new NullPointerException("null pointer");
+        final Throwable parent = new IllegalArgumentException("IllegalArgument", cause);
+        final LogEvent event = new Log4jLogEvent("testLogger", null, this.getClass().getName(), Level.DEBUG,
+                new SimpleMessage("test exception"), parent);
+        final StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        final String result = sb.toString();
+        assertEquals("The method names should be same", "testMethodName", result);
+    }
+
+    @Test
+    public void testLineNumber() {
+        final String[] options = { "short.lineNumber" };
+        final ThrowablePatternConverter converter = ThrowablePatternConverter.newInstance(options);
+        final Throwable cause = new NullPointerException("null pointer");
+        final Throwable parent = new IllegalArgumentException("IllegalArgument", cause);
+        StackTraceElement top = parent.getStackTrace()[0];
+        final int expectedLineNumber = top.getLineNumber();
+
+        final LogEvent event = new Log4jLogEvent("testLogger", null, this.getClass().getName(), Level.DEBUG,
+                new SimpleMessage("test exception"), parent);
+        final StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        final String result = sb.toString();
+        assertTrue("The line numbers should be same", expectedLineNumber == Integer.valueOf(result));
+    }
+}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java	(revision 1517757)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java	(working copy)
@@ -64,6 +64,12 @@
      */
     private final List<String> packages;
 
+    public static final String CLASS_NAME = "short.className";
+    public static final String METHOD_NAME = "short.methodName";
+    public static final String LINE_NUMBER = "short.lineNumber";
+    public static final String FILE_NAME = "short.fileName";
+    public static final String MESSAGE = "short.message";
+
     /**
      * Construct the options for printing stack trace.
      * @param lines The number of lines.
@@ -217,7 +223,9 @@
                     }
                 } else if (option.equalsIgnoreCase(NONE)) {
                     lines = 0;
-                } else if (option.equalsIgnoreCase(SHORT)) {
+                } else if (option.equalsIgnoreCase(SHORT) || option.equalsIgnoreCase(CLASS_NAME) ||
+                        option.equalsIgnoreCase(METHOD_NAME) || option.equalsIgnoreCase(LINE_NUMBER) ||
+                        option.equalsIgnoreCase(FILE_NAME) || option.equalsIgnoreCase(MESSAGE)) {
                     lines = 2;
                 } else if (!option.equalsIgnoreCase(FULL)) {
                     lines = Integer.parseInt(option);
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java	(revision 1517757)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java	(working copy)
@@ -34,6 +34,8 @@
 @ConverterKeys({"ex", "throwable", "exception" })
 public class ThrowablePatternConverter extends LogEventPatternConverter {
 
+    private String rawOption;
+
     /**
      * The number of lines to write.
      */
@@ -48,6 +50,8 @@
     protected ThrowablePatternConverter(final String name, final String style, final String[] options) {
         super(name, style);
         this.options = ThrowableFormatOptions.newInstance(options);
+        if (options != null && options.length > 0)
+            rawOption = options[0];
     }
 
     /**
@@ -68,28 +72,83 @@
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         final Throwable t = event.getThrown();
 
-        if (t != null && options.anyLines()) {
-            final StringWriter w = new StringWriter();
-            t.printStackTrace(new PrintWriter(w));
-            final int len = toAppendTo.length();
+        if (isSubShortOption()) {
+            formatSubShortOption(t, toAppendTo);
+        }
+        else if (t != null && options.anyLines()) {
+            formatOption(t, toAppendTo);
+        }
+    }
+
+    private boolean isSubShortOption() {
+        return ThrowableFormatOptions.MESSAGE.equalsIgnoreCase(rawOption) ||
+                ThrowableFormatOptions.FILE_NAME.equalsIgnoreCase(rawOption) ||
+                ThrowableFormatOptions.LINE_NUMBER.equalsIgnoreCase(rawOption) ||
+                ThrowableFormatOptions.METHOD_NAME.equalsIgnoreCase(rawOption) ||
+                ThrowableFormatOptions.CLASS_NAME.equalsIgnoreCase(rawOption);
+    }
+
+    private void formatSubShortOption(final Throwable t, final StringBuilder toAppendTo) {
+        StackTraceElement[] trace;
+        StackTraceElement throwingMethod = null;
+        int len;
+
+        if (t != null) {
+            trace = t.getStackTrace();
+            if (trace !=null && trace.length > 0) {
+                throwingMethod = trace[0];
+            }
+        }
+
+        if (t != null && throwingMethod != null) {
+            String toAppend = "";
+
+            if (ThrowableFormatOptions.CLASS_NAME.equalsIgnoreCase(rawOption)) {
+                toAppend = throwingMethod.getClassName();
+            }
+            else if (ThrowableFormatOptions.METHOD_NAME.equalsIgnoreCase(rawOption)) {
+                toAppend = throwingMethod.getMethodName();
+            }
+            else if (ThrowableFormatOptions.LINE_NUMBER.equalsIgnoreCase(rawOption)) {
+                toAppend = String.valueOf(throwingMethod.getLineNumber());
+            }
+            else if (ThrowableFormatOptions.MESSAGE.equalsIgnoreCase(rawOption)) {
+                toAppend = t.toString();
+            }
+            else if (ThrowableFormatOptions.FILE_NAME.equalsIgnoreCase(rawOption)) {
+                toAppend = throwingMethod.getFileName();
+            }
+
+            len = toAppendTo.length();
             if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
                 toAppendTo.append(" ");
             }
-            if (!options.allLines() || !Constants.LINE_SEP.equals(options.getSeparator())) {
-                final StringBuilder sb = new StringBuilder();
-                final String[] array = w.toString().split(Constants.LINE_SEP);
-                final int limit = options.minLines(array.length) - 1;
-                for (int i = 0; i <= limit; ++i) {
-                    sb.append(array[i]);
-                    if (i < limit) {
-                        sb.append(options.getSeparator());
-                    }
+            toAppendTo.append(toAppend);
+        }
+    }
+
+    private void formatOption(final Throwable t, final StringBuilder toAppendTo) {
+        final StringWriter w = new StringWriter();
+
+        t.printStackTrace(new PrintWriter(w));
+        final int len = toAppendTo.length();
+        if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
+            toAppendTo.append(" ");
+        }
+        if (!options.allLines() || !Constants.LINE_SEP.equals(options.getSeparator())) {
+            final StringBuilder sb = new StringBuilder();
+            final String[] array = w.toString().split(Constants.LINE_SEP);
+            final int limit = options.minLines(array.length) - 1;
+            for (int i = 0; i <= limit; ++i) {
+                sb.append(array[i]);
+                if (i < limit) {
+                    sb.append(options.getSeparator());
                 }
-                toAppendTo.append(sb.toString());
+            }
+            toAppendTo.append(sb.toString());
 
-            } else {
-                toAppendTo.append(w.toString());
-            }
+        } else {
+            toAppendTo.append(w.toString());
         }
     }
 
