logging-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rgo...@apache.org
Subject svn commit: r1425538 - in /logging/log4j/log4j2/trunk: core/src/main/java/org/apache/logging/log4j/core/layout/ core/src/main/java/org/apache/logging/log4j/core/pattern/ core/src/test/java/org/apache/logging/log4j/core/ core/src/test/resources/ jcl-bri...
Date Sun, 23 Dec 2012 22:17:37 GMT
Author: rgoers
Date: Sun Dec 23 22:17:36 2012
New Revision: 1425538

URL: http://svn.apache.org/viewvc?rev=1425538&view=rev
Log:
LOG4J2-130 - PatternLayout should format throwables without requiring a converter.

Modified:
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
    logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
    logging/log4j/log4j2/trunk/core/src/test/resources/log4j-test2.xml
    logging/log4j/log4j2/trunk/jcl-bridge/src/test/resources/log4j-test1.xml
    logging/log4j/log4j2/trunk/slf4j-impl/src/test/resources/log4j-test1.xml
    logging/log4j/log4j2/trunk/src/changes/changes.xml
    logging/log4j/log4j2/trunk/src/site/xdoc/manual/layouts.xml.vm

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
Sun Dec 23 22:17:36 2012
@@ -80,10 +80,6 @@ public final class PatternLayout extends
      */
     private final String conversionPattern;
 
-    /**
-     * True if any element in pattern formats information from exceptions.
-     */
-    private boolean handlesExceptions;
 
     /**
      * The current Configuration.
@@ -107,8 +103,7 @@ public final class PatternLayout extends
         this.conversionPattern = pattern;
         this.config = config;
         final PatternParser parser = createPatternParser(config);
-        formatters = parser.parse((pattern == null) ? DEFAULT_CONVERSION_PATTERN : pattern);
-        handlesExceptions = parser.handlesExceptions();
+        formatters = parser.parse((pattern == null) ? DEFAULT_CONVERSION_PATTERN : pattern,
true);
     }
 
     /**
@@ -125,7 +120,6 @@ public final class PatternLayout extends
         }
         final PatternParser parser = createPatternParser(this.config);
         formatters = parser.parse(pattern);
-        handlesExceptions = parser.handlesExceptions();
     }
 
     /**

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
Sun Dec 23 22:17:36 2012
@@ -45,7 +45,7 @@ public final class ExtendedThrowablePatt
      *
      * @param options options, may be null.
      */
-    private ExtendedThrowablePatternConverter(final String[] options) {        
+    private ExtendedThrowablePatternConverter(final String[] options) {
         super("ExtendedThrowable", "throwable", options);
         List<String> tempPackages = null;
         if (options != null && options.length > 1) {
@@ -96,7 +96,7 @@ public final class ExtendedThrowablePatt
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         final Throwable throwable = event.getThrown();
-        if (throwable != null) {
+        if (throwable != null && lines > 0) {
             if (!(throwable instanceof ThrowableProxy)) {
                 super.format(event, toAppendTo);
                 return;
@@ -107,10 +107,11 @@ public final class ExtendedThrowablePatt
             if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1)))
{
                 toAppendTo.append(" ");
             }
-            if (lines > 0) {
+            if (lines != Integer.MAX_VALUE) {
                 final StringBuilder sb = new StringBuilder();
                 final String[] array = trace.split("\n");
-                for (int i = 0; i < lines; ++i) {
+                int limit = lines > array.length ? array.length : lines;
+                for (int i = 0; i < limit; ++i) {
                     sb.append(array[i]).append("\n");
                 }
                 toAppendTo.append(sb.toString());

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
Sun Dec 23 22:17:36 2012
@@ -67,4 +67,8 @@ public final class LiteralPatternConvert
     public void format(final StringBuilder output, final Object... objects) {
         output.append(substitute ? config.getSubst().replace(literal) : literal);
     }
+
+    public String getLiteral() {
+        return literal;
+    }
 }

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
Sun Dec 23 22:17:36 2012
@@ -78,11 +78,6 @@ public final class PatternParser {
 
     private static final int DECIMAL = 10;
 
-    /**
-     * Does pattern process exceptions.
-     */
-    private boolean handlesExceptions;
-
     private final Configuration config;
 
     private final Map<String, Class<PatternConverter>> converterRules;
@@ -125,8 +120,12 @@ public final class PatternParser {
         converterRules = converters;
     }
 
-
     public List<PatternFormatter> parse(final String pattern) {
+        return parse(pattern, false);
+    }
+
+
+    public List<PatternFormatter> parse(final String pattern, boolean handleExceptions)
{
         final List<PatternFormatter> list = new ArrayList<PatternFormatter>();
         final List<PatternConverter> converters = new ArrayList<PatternConverter>();
         final List<FormattingInfo> fields = new ArrayList<FormattingInfo>();
@@ -134,6 +133,7 @@ public final class PatternParser {
         parse(pattern, converters, fields);
 
         final Iterator<FormattingInfo> fieldIter = fields.iterator();
+        boolean handlesExceptions = false;
 
         for (final PatternConverter converter : converters) {
             LogEventPatternConverter pc;
@@ -152,13 +152,13 @@ public final class PatternParser {
             }
             list.add(new PatternFormatter(pc, field));
         }
+        if (handleExceptions && !handlesExceptions) {
+            LogEventPatternConverter pc = ExtendedThrowablePatternConverter.newInstance(null);
+            list.add(new PatternFormatter(pc, FormattingInfo.getDefault()));
+        }
         return list;
     }
 
-    public boolean handlesExceptions() {
-        return handlesExceptions;
-    }
-
     /**
      * Extract the converter identifier found at position i.
      * <p/>

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
Sun Dec 23 22:17:36 2012
@@ -97,7 +97,7 @@ public final class RootThrowablePatternC
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         final Throwable throwable = event.getThrown();
-        if (throwable != null) {
+        if (throwable != null && lines > 0) {
             if (!(throwable instanceof ThrowableProxy)) {
                 super.format(event, toAppendTo);
                 return;
@@ -108,10 +108,11 @@ public final class RootThrowablePatternC
             if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1)))
{
                 toAppendTo.append(" ");
             }
-            if (lines > 0) {
+            if (lines != Integer.MAX_VALUE) {
                 final StringBuilder sb = new StringBuilder();
                 final String[] array = trace.split("\n");
-                for (int i = 0; i < lines; ++i) {
+                int limit = lines > array.length ? array.length : lines;
+                for (int i = 0; i < limit; ++i) {
                     sb.append(array[i]).append("\n");
                 }
                 toAppendTo.append(sb.toString());

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
Sun Dec 23 22:17:36 2012
@@ -32,6 +32,7 @@ import java.io.StringWriter;
 @ConverterKeys({"ex", "throwable", "exception" })
 public class ThrowablePatternConverter extends LogEventPatternConverter {
 
+    protected static final String NONE = "none";
     /**
      * Format the whole stack trace.
      */
@@ -60,10 +61,12 @@ public class ThrowablePatternConverter e
      */
     protected ThrowablePatternConverter(final String name, final String style, final String[]
options) {
         super(name, style);
-        int count = 0;
+        int count = Integer.MAX_VALUE;
         if ((options != null) && (options.length > 0)) {
             option = options[0];
             if (option == null) {
+            } else if (option.equalsIgnoreCase(NONE)) {
+                count = 0;
             } else if (option.equalsIgnoreCase(SHORT)) {
                 count = 2;
             } else if (!option.equalsIgnoreCase(FULL)) {
@@ -94,17 +97,18 @@ public class ThrowablePatternConverter e
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         final Throwable t = event.getThrown();
 
-        if (t != null) {
+        if (t != null && lines > 0) {
             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 (lines > 0) {
+            if (lines != Integer.MAX_VALUE) {
                 final StringBuilder sb = new StringBuilder();
                 final String[] array = w.toString().split("\n");
-                for (int i = 0; i < lines; ++i) {
+                int limit = lines > array.length ? array.length : lines;
+                for (int i = 0; i < limit; ++i) {
                     sb.append(array[i]).append("\n");
                 }
                 toAppendTo.append(sb.toString());

Modified: logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
(original)
+++ logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
Sun Dec 23 22:17:36 2012
@@ -52,6 +52,7 @@ public class LoggerTest {
     private static Configuration config;
     private static ListAppender app;
     private static ListAppender host;
+    private static ListAppender noThrown;
     private static LoggerContext ctx;
 
     @BeforeClass
@@ -75,6 +76,8 @@ public class LoggerTest {
                 app = (ListAppender) entry.getValue();
             } else if (entry.getKey().equals("HostTest")) {
                 host = (ListAppender) entry.getValue();
+            } else if (entry.getKey().equals("NoThrowable")) {
+                noThrown = (ListAppender) entry.getValue();
             }
         }
         assertNotNull("No Appender", app);
@@ -189,6 +192,28 @@ public class LoggerTest {
     }
 
     @Test
+    public void testImpliedThrowable() {
+        final org.apache.logging.log4j.Logger testLogger = LogManager.getLogger("org.apache.logging.log4j.hosttest");
+        testLogger.debug("This is a test", new Throwable("Testing"));
+        final List<String> msgs = host.getMessages();
+        assertTrue("Incorrect number of messages. Expected 1, actual " + msgs.size(), msgs.size()
== 1);
+        String expected = "java.lang.Throwable: Testing";
+        assertTrue("Incorrect message data", msgs.get(0).contains(expected));
+    }
+
+
+    @Test
+    public void testSuppressedThrowable() {
+        final org.apache.logging.log4j.Logger testLogger = LogManager.getLogger("org.apache.logging.log4j.nothrown");
+        testLogger.debug("This is a test", new Throwable("Testing"));
+        final List<String> msgs = noThrown.getMessages();
+        assertTrue("Incorrect number of messages. Expected 1, actual " + msgs.size(), msgs.size()
== 1);
+        String suppressed = "java.lang.Throwable: Testing";
+        assertTrue("Incorrect message data", !msgs.get(0).contains(suppressed));
+    }
+
+
+    @Test
     public void mdc() {
         ThreadContext.put("TestYear", new Integer(2010).toString());
         logger.debug("Debug message");

Modified: logging/log4j/log4j2/trunk/core/src/test/resources/log4j-test2.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/resources/log4j-test2.xml?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/resources/log4j-test2.xml (original)
+++ logging/log4j/log4j2/trunk/core/src/test/resources/log4j-test2.xml Sun Dec 23 22:17:36
2012
@@ -47,6 +47,9 @@
     <List name="HostTest">
       <PatternLayout pattern="%d %p %C{1.} [%t] %m ${hostName}%n"/>
     </List>
+    <List name="NoThrowable">
+      <PatternLayout pattern="%d %p %C{1.} [%t] %m%n%ex{0}"/>
+    </List>
   </appenders>
 
   <loggers>
@@ -61,6 +64,12 @@
       <appender-ref ref="HostTest"/>
     </logger>
 
+
+    <logger name="org.apache.logging.log4j.nothrown" level="debug" additivity="false">
+      <appender-ref ref="NoThrowable"/>
+    </logger>
+
+
     <logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
       <appender-ref ref="File"/>
     </logger>>

Modified: logging/log4j/log4j2/trunk/jcl-bridge/src/test/resources/log4j-test1.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/jcl-bridge/src/test/resources/log4j-test1.xml?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/jcl-bridge/src/test/resources/log4j-test1.xml (original)
+++ logging/log4j/log4j2/trunk/jcl-bridge/src/test/resources/log4j-test1.xml Sun Dec 23 22:17:36
2012
@@ -18,7 +18,7 @@
       </PatternLayout>
     </File>
     <List name="List">
-      <PatternLayout pattern="%C{1.} %m MDC%X%n"/>
+      <PatternLayout pattern="%C{1.} %m MDC%X%n%ex{0}"/>
     </List>
   </appenders>
 

Modified: logging/log4j/log4j2/trunk/slf4j-impl/src/test/resources/log4j-test1.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/slf4j-impl/src/test/resources/log4j-test1.xml?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/slf4j-impl/src/test/resources/log4j-test1.xml (original)
+++ logging/log4j/log4j2/trunk/slf4j-impl/src/test/resources/log4j-test1.xml Sun Dec 23 22:17:36
2012
@@ -18,7 +18,7 @@
       </PatternLayout>
     </File>
     <List name="List">
-      <PatternLayout pattern="%C{1.} %m MDC%X%n"/>
+      <PatternLayout pattern="%C{1.} %m MDC%X%n%ex{0}"/>
     </List>
     <SLF4J name="SLF4J"/>
   </appenders>

Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Sun Dec 23 22:17:36 2012
@@ -23,6 +23,9 @@
 
   <body>
     <release version="2.0-beta4" date="TBD" description="Bug fixes and enhancements">
+      <action issue="LOG4J2-130" dev="rgoers" type="fix">
+        PatternLayout should format throwables without requiring a converter.
+      </action>
       <action dev="rgoers" type="add">
         Added hostName and contextName to property map.
       </action>

Modified: logging/log4j/log4j2/trunk/src/site/xdoc/manual/layouts.xml.vm
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/site/xdoc/manual/layouts.xml.vm?rev=1425538&r1=1425537&r2=1425538&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/site/xdoc/manual/layouts.xml.vm (original)
+++ logging/log4j/log4j2/trunk/src/site/xdoc/manual/layouts.xml.vm Sun Dec 23 22:17:36 2012
@@ -105,7 +105,11 @@ WARN  [main]: Message 2</pre>
             In the example above the conversion specifier <b>%-5p</b> means the
priority of the logging event should
             be left justified to a width of five characters.
           </p>
-
+          <p>
+            If the pattern string does not contain a specifier to handle a Throwable being
logged, parsing of the
+            pattern will act as if the "%xEx" specifier had be added to the end of the string.
To suppress
+            formatting of the Throwable completely simply add "%ex{0}" as a specifier in
the pattern string.
+          </p>
           <table>
             <tr>
               <th>Parameter Name</th>
@@ -271,9 +275,9 @@ WARN  [main]: Message 2</pre>
             </tr>
             <tr>
               <td align="center">
-                <b>ex</b>{["short"|"full"|depth]}<br />
-                <b>exception</b>{["short"|"full"|depth]}<br />
-                <b>throwable</b>{["short"|"full"|depth]}
+                <b>ex</b>{["none"|"short"|"full"|depth]}<br />
+                <b>exception</b>{["none"|"short"|"full"|depth]}<br />
+                <b>throwable</b>{["none"|"short"|"full"|depth]}
               </td>
               <td>
                 <p>Outputs the Throwable trace that has been bound to the LoggingEvent,
by
@@ -282,7 +286,8 @@ WARN  [main]: Message 2</pre>
                   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.
+                  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>
             </tr>
@@ -571,9 +576,9 @@ WARN  [main]: Message 2</pre>
             </tr>
             <tr>
               <td align="center">
-                <b>rEx</b>["short"|"full"|depth],[filters(packages)}<br />
-                <b>rException</b>["short"|"full"|depth],[filters(packages)}<br
/>
-                <b>rThrowable</b>["short"|"full"|depth],[filters(packages)}
+                <b>rEx</b>["none"|"short"|"full"|depth],[filters(packages)}<br
/>
+                <b>rException</b>["none"|"short"|"full"|depth],[filters(packages)}<br
/>
+                <b>rThrowable</b>["none"|"short"|"full"|depth],[filters(packages)}
               </td>
               <td>
                 <p>The same as the %throwable conversion word but the stack trace is
printed starting with the
@@ -584,7 +589,8 @@ WARN  [main]: Message 2</pre>
                   which will only output the first line of the Throwable or <b>%rEx{n}</b>
where
                   the first n lines of the stacktrace will be printed. The conversion word
can also be
                   followed by "filters(packages)" where packages is a list of package names
that should
-                  be suppressed from stack traces.
+                  be suppressed from stack traces. Specifying <b>%rEx{none}</b>
+                  or <b>%rEx{0}</b> will suppress printing of the exception.
                 </p>
               </td>
             </tr>
@@ -776,9 +782,9 @@ WARN  [main]: Message 2</pre>
             </tr>
             <tr>
               <td align="center">
-                <b>xEx</b>{["short"|"full"|depth],[filters(packages)}<br />
-                <b>xException</b>["short"|"full"|depth],[filters(packages)}<br
/>
-                <b>xThrowable</b>["short"|"full"|depth],[filters(packages)}
+                <b>xEx</b>{"none"|"short"|"full"|depth],[filters(packages)}<br
/>
+                <b>xException</b>["none"|"short"|"full"|depth],[filters(packages)}<br
/>
+                <b>xThrowable</b>["none"|"short"|"full"|depth],[filters(packages)}
               </td>
               <td>
                 <p>The same as the %throwable conversion word but also includes class
packaging information.
@@ -793,7 +799,8 @@ WARN  [main]: Message 2</pre>
                   which will only output the first line of the Throwable or <b>%xEx{n}</b>
where
                   the first n lines of the stacktrace will be printed. The conversion word
can also be
                   followed by "filters(packages)" where packages is a list of package names
that should
-                  be suppressed from stack traces.
+                  be suppressed from stack traces. Specifying <b>%xEx{none}</b>
+                  or <b>%xEx{0}</b> will suppress printing of the exception.
                 </p>
               </td>
             </tr>



Mime
View raw message