| <?xml version="1.0" encoding="UTF-8"?>
|
| <!--
|
| Licensed to the Apache Software Foundation (ASF) under one or more
|
| contributor license agreements. See the NOTICE file distributed with
|
| this work for additional information regarding copyright ownership.
|
| The ASF licenses this file to You under the Apache License, Version 2.0
|
| (the "License"); you may not use this file except in compliance with
|
| the License. You may obtain a copy of the License at
|
|
|
| http://www.apache.org/licenses/LICENSE-2.0
|
|
|
| Unless required by applicable law or agreed to in writing, software
|
| distributed under the License is distributed on an "AS IS" BASIS,
|
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| See the License for the specific language governing permissions and
|
| limitations under the License.
|
| -->
|
| <document xmlns="http://maven.apache.org/XDOC/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
| xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
|
|
|
| <properties>
|
| <title>LoggerLayoutPattern</title>
|
| </properties>
|
|
|
| <body>
|
| <section name="LoggerLayoutPattern">
|
|
|
| <p>LoggerLayoutPattern is a flexible layout configurable via a conversion pattern.</p>
|
|
|
| <subsection name="Parameters">
|
| <p>The following parameters are available:</p>
|
|
|
| <table>
|
| <thead>
|
| <tr>
|
| <th>Parameter</th>
|
| <th>Type</th>
|
| <th>Required</th>
|
| <th>Default</th>
|
| <th>Description</th>
|
| </tr>
|
| </thead>
|
| <tbody>
|
| <tr>
|
| <td>conversionPattern</td>
|
| <td>string</td>
|
| <td>No</td>
|
| <td>%message%newline</td>
|
| <td>String which controls the output. See full specification below.</td>
|
| </tr>
|
| </tbody>
|
| </table>
|
|
|
| <h4>Conversion patterns</h4>
|
|
|
| <p><strong>Conversion pattern</strong> is a string which controls the formatting of logging
|
| events. It controls how logging events will be transformed into strings by the layout.</p>
|
|
|
| <p>The conversion pattern is closely related to the conversion pattern of the PHP
|
| <a href="http://www.php.net/manual/en/function.sprintf.php" class="external">sprintf</a> function.
|
| It is composed of literal text and format control expressions called <em>conversion specifiers</em>.
|
| </p>
|
|
|
| <p>A conversion specifier begins with a percent sign (%) and is followed by a <em>conversion word</em>.
|
| Some conversion words require one or more <em>options</em> to be given. These are specified in braces after the
|
| conversion word. An example of a conversion specifier is <code>%message</code> which will be converted into
|
| the message from the logging event which is being logged.</p>
|
|
|
| <p>The recognized conversion specifiers are:</p>
|
|
|
| <table class="table table-bordered">
|
| <thead>
|
| <tr>
|
| <th>Conversion specifier</th>
|
| <th>Converts to</th>
|
| </tr>
|
| </thead>
|
| <tbody>
|
| <tr>
|
| <td>
|
| <p><strong>%c</strong>{length}</p>
|
| <p><strong>%lo</strong>{length}</p>
|
| <p><strong>%logger</strong>{length}</p>
|
| </td>
|
| <td>
|
| <p>Name of the Logger which generated the logging request.</p>
|
|
|
| <p>Optionally, a desired output length can be specified. If given, the converter will attempt
|
| to abbreviate the logger name without losing too much information in the process. If
|
| zero length is specified, only the rightmost name fragment will be output.</p>
|
|
|
| <p>Specifying the desired length 0 means that only the class name will be returned without
|
| the corresponding namespace.</p>
|
|
|
| <p>Several examples of the shortening algorithm in action:</p>
|
|
|
| <table class="table table-bordered table-not-wide">
|
| <thead>
|
| <tr>
|
| <th>Conversion specifier</th>
|
| <th>Logger name</th>
|
| <th>Result</th>
|
| </tr>
|
| </thead>
|
| <tbody>
|
| <tr>
|
| <td>%logger</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| </tr>
|
| <tr>
|
| <td>%logger{0}</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| <td>Foo</td>
|
| </tr>
|
| <tr>
|
| <td>%logger{10}</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| <td>o\a\l\l\Foo</td>
|
| </tr>
|
| <tr>
|
| <td>%logger{20}</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| <td>o\a\l\log4php\Foo</td>
|
| </tr>
|
| <tr>
|
| <td>%logger{25}</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| <td>o\a\logging\log4php\Foo</td>
|
| </tr>
|
| <tr>
|
| <td>%logger{30}</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| <td>org\apache\logging\log4php\Foo</td>
|
| </tr>
|
| </tbody>
|
| </table>
|
|
|
| <p>Note that rightmost segment will never be shortened. It is possible that the
|
| resulting string will be longer than the specified desired length.</p>
|
| <p>For backward compatibility, a dot can be used as a namespace separator, as well as
|
| the backslash.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%C</strong>{length}</p>
|
| <p><strong>%class</strong>{length}</p>
|
| </td>
|
| <td>
|
| <p>The fully qualified class name of the caller issuing the logging request.</p>
|
| <p>Just like <strong>%logger</strong>, a desired length can be defined as an option.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%cookie</strong>{key}</p>
|
| </td>
|
| <td>
|
| <p>A value from the $_COOKIE superglobal array corresponding to the given key.</p>
|
| <p>If no key is given, will return all values in key=value format.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%d</strong>{pattern}</p>
|
| <p><strong>%date</strong>{pattern}</p>
|
| </td>
|
| <td>
|
| <p>The date/time of the logging event. Accepts a pattern string as an option. The
|
| pattern syntax is the same as used by the PHP's <code><a href="http://php.net/manual/en/function.date.php"
|
| class="external">date()</a></code> function.</p>
|
|
|
| <p>If no pattern is given, the date format will default to the ISO8601 datetime format,
|
| which is the same as giving the pattern: <code>c</code>.</p>
|
|
|
| <table>
|
| <thead>
|
| <tr>
|
| <th>Conversion specifier</th>
|
| <th>Result</th>
|
| </tr>
|
| </thead>
|
| <tbody>
|
| <tr>
|
| <td>%d</td>
|
| <td>2011-12-27T12:01:32+01:00</td>
|
| </tr>
|
| <tr>
|
| <td>%date</td>
|
| <td>2011-12-27T12:01:32+01:00</td>
|
| </tr>
|
| <tr>
|
| <td>%date{ISO8601}</td>
|
| <td>2011-12-27T12:01:32+01:00</td>
|
| </tr>
|
| <tr>
|
| <td>%date{Y-m-d H:i:s,u}</td>
|
| <td>2011-12-27 12:01:32,610</td>
|
| </tr>
|
| <tr>
|
| <td>%date{l jS \of F Y h:i:s A}</td>
|
| <td>Tuesday 27th of December 2011 12:01:32 PM</td>
|
| </tr>
|
| </tbody>
|
| </table>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%e</strong>{key}</p>
|
| <p><strong>%env</strong>{key}</p>
|
| </td>
|
| <td>
|
| <p>A value from the $_ENV superglobal array corresponding to the given key.</p>
|
| <p>If no key is given, will return all values in key=value format.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%ex</strong></p>
|
| <p><strong>%exception</strong></p>
|
| <p><strong>%throwable</strong></p>
|
| </td>
|
| <td>
|
| <p>The exception associated with the logging event, along with it's stack trace. If
|
| there is no exception, evalutates to an empty string.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%F</strong></p>
|
| <p><strong>%file</strong></p>
|
| </td>
|
| <td>Name of the file from which the logging request was issued.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%l</strong></p>
|
| <p><strong>%location</strong></p>
|
| </td>
|
| <td>
|
| <p>Location information of the caller which generated the logging event.</p>
|
| <p>Identical to <code>%C.%M(%F:%L)</code></p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%L</strong></p>
|
| <p><strong>%line</strong></p>
|
| </td>
|
| <td>The line number at which the logging request was issued.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%m</strong></p>
|
| <p><strong>%msg</strong></p>
|
| <p><strong>%message</strong></p>
|
| </td>
|
| <td>The message associated with the logging event.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%M</strong></p>
|
| <p><strong>%method</strong></p>
|
| </td>
|
| <td>The method or function name from which the logging request was issued.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%n</strong></p>
|
| <p><strong>%newline</strong></p>
|
| </td>
|
| <td>
|
| <p>A platform dependent line-break character(s).</p>
|
| <p>Note that a line break will not be printed unless explicitely specified.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%p</strong></p>
|
| <p><strong>%le</strong></p>
|
| <p><strong>%level</strong></p>
|
| </td>
|
| <td>The level of the logging event.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%r</strong></p>
|
| <p><strong>%relative</strong></p>
|
| </td>
|
| <td>The number of milliseconds elapsed since the start of the application until the creation of the logging event.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%req</strong>{key}</p>
|
| <p><strong>%request</strong>{key}</p>
|
| </td>
|
| <td>
|
| <p>A value from the $_REQUEST superglobal array corresponding to the given key.</p>
|
| <p>If no key is given, will return all values in key=value format.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%s</strong>{key}</p>
|
| <p><strong>%server</strong>{key}</p>
|
| </td>
|
| <td>
|
| <p>A value from the $_SERVER superglobal array corresponding to the given key.</p>
|
| <p>If no key is given, will return all values in key=value format.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%ses</strong>{key}</p>
|
| <p><strong>%session</strong>{key}</p>
|
| </td>
|
| <td>
|
| <p>A value from the $_SESSION superglobal array corresponding to the given key.</p>
|
| <p>If no key is given, will return all values in key=value format.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%sid</strong></p>
|
| <p><strong>%sessionid</strong></p>
|
| </td>
|
| <td>
|
| <p>The active session ID, or an empty string if not in session.</p>
|
| <p>Equivalent to calling <code>session_id()</code>.</p>
|
| </td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%t</strong></p>
|
| <p><strong>%pid</strong></p>
|
| <p><strong>%process</strong></p>
|
| </td>
|
| <td>The ID of the process that generated the logging event.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%x</strong></p>
|
| <p><strong>%ndc</strong></p>
|
| </td>
|
| <td>The NDC (Nested Diagnostic Context) associated with the thread that generated the logging event.</td>
|
| </tr>
|
| <tr>
|
| <td>
|
| <p><strong>%X</strong>{key}</p>
|
| <p><strong>%mdc</strong>{key}</p>
|
| </td>
|
| <td>
|
| <p>A value from the Mapped Diagnostic Context (MDC) corresponding to the given key.</p>
|
| </td>
|
| </tr>
|
| </tbody>
|
| </table>
|
| </subsection>
|
|
|
| <subsection name="Format modifiers">
|
| <p>By default the relevant information is output as-is. However, with the aid of format modifiers
|
| it is possible to change the minimum and maximum width and the justifications of each data field.
|
| </p>
|
|
|
| <p>Both format modifiers are optional, and are placed between the percent sign (%) and the conversion
|
| word. These are, in order:</p>
|
|
|
| <ol>
|
| <li>A <b>minimum width specifier</b>, a number which determines the minimum width of the resulting
|
| string. If the resulting string is shorter that the given number, it will be padded with spaces to
|
| the desired length. By default, the string is right-justified (padded from left), but adding a
|
| "-" sign before the specifier will make it left-justified.</li>
|
|
|
| <li>A <b>maximum widht specifier</b>, a dot (".") followed by a number which determines the maximum
|
| allowed width of the resulting string. If the resulting string is shorter than the given number, it
|
| will be truncated to the maximum width. By default the string is truncated from the right, but
|
| adding a "-" sign before the specifier will cause it to truncate from the left.</li>
|
| </ol>
|
|
|
| <p>The following table demonstrates various uses of format modifiers:</p>
|
|
|
| <table>
|
| <thead>
|
| <tr>
|
| <th>Format modifier</th>
|
| <th>Padding</th>
|
| <th>Trimming</th>
|
| <th>Minimum width</th>
|
| <th>Maximum width</th>
|
| <th>Comment</th>
|
| </tr>
|
| </thead>
|
| <tbody>
|
| <tr>
|
| <td align="center"><strong>%logger</strong></td>
|
| <td align="center">none</td>
|
| <td align="center">none</td>
|
| <td align="center">none</td>
|
| <td align="center">none</td>
|
| <td>Output the logger name as-is.</td>
|
| </tr>
|
| <tr>
|
| <td align="center"><strong>%20logger</strong></td>
|
| <td align="center">right</td>
|
| <td align="center">none</td>
|
| <td align="center">20</td>
|
| <td align="center">none</td>
|
| <td>Left pad with spaces if the logger name is less than 20 characters long.</td>
|
| </tr>
|
| <tr>
|
| <td align="center"><strong>%-20logger</strong></td>
|
| <td align="center">left</td>
|
| <td align="center">none</td>
|
| <td align="center">20</td>
|
| <td align="center">none</td>
|
| <td>Right pad with spaces if the logger name is less than 20 characters long.</td>
|
| </tr>
|
| <tr>
|
| <td align="center"><strong>%.30logger</strong></td>
|
| <td align="center">none</td>
|
| <td align="center">right</td>
|
| <td align="center">none</td>
|
| <td align="center">30</td>
|
| <td>Trim from the end if the logger name is longer than 30 characters.</td>
|
| </tr>
|
| <tr>
|
| <td align="center"><strong>%.-30logger</strong></td>
|
| <td align="center">none</td>
|
| <td align="center">left</td>
|
| <td align="center">none</td>
|
| <td align="center">30</td>
|
| <td>Trim from the beginning if the logger name is longer than 30 characters.</td>
|
| </tr>
|
| <tr>
|
| <td align="center"><strong>%20.30logger</strong></td>
|
| <td align="center">right</td>
|
| <td align="center">right</td>
|
| <td align="center">20</td>
|
| <td align="center">30</td>
|
| <td>Left pad with spaces if the logger name is shorter than 20 characters. However, if
|
| the logger name is longer than 30 characters, then trim from the end.</td>
|
| </tr>
|
| <tr>
|
| <td align="center"><strong>%-20.30logger</strong></td>
|
| <td align="center">left</td>
|
| <td align="center">right</td>
|
| <td align="center">20</td>
|
| <td align="center">30</td>
|
| <td>Right pad with spaces if the logger name is shorter than 20 characters. However, if the
|
| logger name is longer than 30 characters, then trim from the end.</td>
|
| </tr>
|
| </tbody>
|
| </table>
|
|
|
| <p>The following table lists a couple of examples for using format modifiers. Note that the square
|
| brackets are added to the conversion pattern to delimit the output.</p>
|
|
|
| <table class="table table-bordered table-striped table-not-wide">
|
| <thead>
|
| <tr>
|
| <th>Conversion pattern</th>
|
| <th>Logger name</th>
|
| <th>Result</th>
|
| </tr>
|
| </thead>
|
| <tbody>
|
| <tr>
|
| <td>[%10logger]</td>
|
| <td>Foo</td>
|
| <td><code>[ Foo]</code></td>
|
| <td>Added padding, right aligned.</td>
|
| </tr>
|
| <tr>
|
| <td>[%-10logger]</td>
|
| <td>Foo</td>
|
| <td><code>[Foo ]</code></td>
|
| <td>Added padding, left aligned.</td>
|
| </tr>
|
| <tr>
|
| <td>[%.10logger]</td>
|
| <td>org.apache.log4php.Foo</td>
|
| <td><code>[org.apache]</code></td>
|
| <td>Trimmed from right.</td>
|
| </tr>
|
| <tr>
|
| <td>[%.-10logger]</td>
|
| <td>org.apache.log4php.Foo</td>
|
| <td><code>[og4php.Foo]</code></td>
|
| <td>Trimmed from left.</td>
|
| </tr>
|
| </tbody>
|
| </table>
|
| </subsection>
|
|
|
| <subsection name="Examples">
|
| <p>The following configuration configures a <code>LoggerAppenderEcho</code> which uses the pattern
|
| layout. All examples will use the same code and configuration, only the conversion pattern will
|
| change from example to example.</p>
|
|
|
| <div class="auto-tabs">
|
| <ul>
|
| <li>XML</li>
|
| <li>PHP</li>
|
| </ul>
|
|
|
| <div class="tab-content" >
|
| <div class="tab-pane">
|
| <pre class="prettyprint linenums"><![CDATA[
|
| <configuration xmlns="http://logging.apache.org/log4php/">
|
| <appender name="default" class="LoggerAppenderEcho">
|
| <layout class="LoggerLayoutPattern">
|
| <param name="conversionPattern" value="%date %logger %-5level %msg%n" />
|
| </layout>
|
| </appender>
|
| <root>
|
| <appender_ref ref="default" />
|
| </root>
|
| </configuration>
|
| ]]></pre>
|
| </div>
|
| <div class="tab-pane">
|
| <pre class="prettyprint linenums"><![CDATA[
|
| array(
|
| 'appenders' => array(
|
| 'default' => array(
|
| 'class' => 'LoggerAppenderEcho',
|
| 'layout' => array(
|
| 'class' => 'LoggerLayoutPattern',
|
| 'params' => array(
|
| 'conversionPattern' => '%date %logger %-5level %msg%n'
|
| )
|
| )
|
| )
|
| ),
|
| 'rootLogger' => array(
|
| 'appenders' => array('default')
|
| ),
|
| )
|
| ]]></pre>
|
| </div>
|
| </div>
|
| </div>
|
|
|
|
|
| <p>Example code:</p>
|
|
|
| <pre class="prettyprint linenums">
|
| Logger::configure("config.xml");
|
| $logger = Logger::getLogger('myLogger');
|
| $logger->info("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
|
| $logger->debug("Donec a diam lectus.");
|
| $logger->warn("Sed sit amet ipsum mauris.");
|
| </pre>
|
|
|
| <h4>A simple example</h4>
|
|
|
| <p>Conversion pattern: <code>%date %logger %-5level %msg%n</code></p>
|
|
|
| <p>Running the example code produces the following output:</p>
|
|
|
| <pre>
|
| 2012-02-27T19:42:17+01:00 myLogger INFO Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
| 2012-02-27T19:42:17+01:00 myLogger DEBUG Donec a diam lectus.
|
| 2012-02-27T19:42:17+01:00 myLogger WARN Sed sit amet ipsum mauris.
|
| </pre>
|
|
|
| <p>In this example, <code>%date</code> is converted to the event datetime in default format
|
| (corresponding to the ISO-8601 specification), and <code>%-5level</code> produces the event
|
| level right padded to 5 characters. Since longest level name is 5 characters long, this
|
| ensures that the message always starts at the same character position which improves log
|
| readability.</p>
|
|
|
| <p>Notice that the newline between logging events (%n) has to be explicitely defined. Otherwise all
|
| logging events will be logged in the same line.</p>
|
|
|
| <h4>Formatting the date</h4>
|
|
|
| <p>The <code>%date</code> conversion word can take the desired date format as an option. For example,
|
| if you're European, the d.m.Y date format might be more familiar. Also, adding milliseconds.</p>
|
|
|
| <p>Conversion pattern: <code>%date{d.m.Y H:i:s,u} %logger %-5level %msg%n</code></p>
|
|
|
| <p>Running the example code produces the following output:</p>
|
|
|
| <pre>
|
| 27.02.2012 20:14:41,624 myLogger INFO Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
| 27.02.2012 20:14:41,625 myLogger DEBUG Donec a diam lectus.
|
| 27.02.2012 20:14:41,626 myLogger WARN Sed sit amet ipsum mauris.
|
| </pre>
|
|
|
| <h4>Logging HTTP requests</h4>
|
|
|
| <p>If log4php is used to log HTTP requests, a pattern like this might be useful:</p>
|
|
|
| <p><code>%date [%pid] From:%server{REMOTE_ADDR}:%server{REMOTE_PORT} Request:[%request] Message: %msg%n</code></p>
|
|
|
| <p>Request <code>/test.php?foo=bar</code> it will produce the output similar to:</p>
|
|
|
| <pre>
|
| 2012-01-02T14:19:33+01:00 [22924] From:194.152.205.71:11257 Request:[foo=bar] Message: Lorem ipsum dolor sit amet, consectetur adipiscing elit. |
| 2012-01-02T14:19:33+01:00 [22924] From:194.152.205.71:11257 Request:[foo=bar] Message: Donec a diam lectus. |
| 2012-01-02T14:19:33+01:00 [22924] From:194.152.205.71:11257 Request:[foo=bar] Message: Sed sit amet ipsum mauris.
|
| </pre> |
| |
| <p><code>%server{REMOTE_ADDR}</code> is equivalent to PHP code <code>$_SERVER['REMOTE_ADDR']</code>.</p>
|
|
|
| <h4>Logging exceptions</h4>
|
|
|
| <p>If you wish to log any exception passed to the logging methods, you should add the <code>%ex</code>
|
| specifier to the end of your conversion pattern, after <code>%newline</code>. This way, if an exception
|
| is loggerd it will be addded to your log below your message.</p>
|
|
|
| <p>For example: <code>%date %logger %message%newline%ex</code></p>
|
|
|
| <p>In the following code, suppose that the work() method can throw an exception. This wolud be a good
|
| way to deal with it:</p>
|
|
|
| <pre class="prettyprint linenums">
|
| $log = Logger::getLogger('foo');
|
| $log->info("Let's try this");
|
|
|
| try
|
| {
|
| $foo = new Foo();
|
| $foo->work(123);
|
| }
|
| catch(Exception $ex)
|
| {
|
| // Exception is passed as the second parameter
|
| $log->error("That didn't work", $ex);
|
| }
|
| $log->info("Done.");
|
| </pre>
|
|
|
| <p>If work() throws an exception, your log might look something like this:</p>
|
|
|
| <pre>
|
| 2012-10-08T10:11:18+02:00 foo Let's try this
|
| 2012-10-08T10:11:18+02:00 foo That didn't work
|
| exception 'Exception' with message 'Doesn't work' in D:\work\exceptions.php:38
|
| Stack trace:
|
| #0 D:\work\exceptions.php(29): Bar->work(123)
|
| #1 D:\work\exceptions.php(48): Foo->work(123)
|
| #2 {main}
|
| 2012-10-08T10:11:18+02:00 foo Done.
|
| </pre>
|
|
|
| <p>The exception, along with the full stack trace ends up in your log. This also works with nested
|
| exceptions, the full stack trace is added.</p>
|
| </subsection>
|
| </section>
|
| </body>
|
| </document>
|