blob: 0622e00077cc3b9725e08a8f43138d29c6085cfa [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia Site Renderer 1.9.1 from src/site/xdoc/manual/messages.xml at 2020-05-10
| Rendered using Apache Maven Fluido Skin 1.8
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="generator" content="Apache Maven Doxia Site Renderer 1.9.1" />
<meta name="author" content="Ralph Goers" />
<title>Log4j &#x2013; Log4j 2 API Messages</title>
<link rel="stylesheet" href="../css/apache-maven-fluido-1.8.min.css" />
<link rel="stylesheet" href="../css/site.css" />
<link rel="stylesheet" href="../css/print.css" media="print" />
<script src="../js/apache-maven-fluido-1.8.min.js"></script>
</head>
<body class="topBarDisabled">
<div class="container-fluid">
<header>
<div id="banner">
<div class="pull-left"><a href="http://logging.apache.org" id="bannerLeft"><img src="../images/ls-logo.jpg" alt=""/></a></div>
<div class="pull-right"><a href="http://logging.apache.org/log4j/2.x" id="bannerRight"><img src="../images/logo.png" alt=""/></a></div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li id="publishDate">Last Published: 2020-05-10<span class="divider">|</span>
</li>
<li id="projectVersion">Version: 2.13.3</li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://github.com/apache/logging-log4j2" class="externalLink" title="GitHub">GitHub</a></li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://analysis.apache.org/dashboard/index/org.apache.logging.log4j:log4j" class="externalLink" title="Sonar">Sonar</a></li>
<li class="pull-right"><span class="divider">|</span>
<a href="../../../" title="Logging Services">Logging Services</a></li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://www.apache.org/" class="externalLink" title="Apache">Apache</a></li>
<li class="pull-right"><a href="https://cwiki.apache.org/confluence/display/LOGGING/Log4j" class="externalLink" title="Logging Wiki">Logging Wiki</a></li>
</ul>
</div>
</header>
<div class="row-fluid">
<header id="leftColumn" class="span2">
<nav class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/home.png" alt="Apache Log4j™ 2" border="0"/> Apache Log4j™ 2</li>
<li><a href="../index.html" title="About"><span class="none"></span>About</a></li>
<li><a href="../download.html" title="Download"><span class="none"></span>Download</a></li>
<li><a href="../javadoc.html" title="Javadoc"><span class="icon-chevron-right"></span>Javadoc</a></li>
<li><a href="../maven-artifacts.html" title="Maven, Ivy, Gradle Artifacts"><span class="icon-chevron-right"></span>Maven, Ivy, Gradle Artifacts</a></li>
<li><a href="../runtime-dependencies.html" title="Runtime Dependencies"><span class="none"></span>Runtime Dependencies</a></li>
<li><a href="../changelog.html" title="Changelog"><span class="none"></span>Changelog</a></li>
<li><a href="../faq.html" title="FAQ"><span class="none"></span>FAQ</a></li>
<li><a href="../performance.html" title="Performance"><span class="icon-chevron-right"></span>Performance</a></li>
<li><a href="../articles.html" title="Articles and Tutorials"><span class="none"></span>Articles and Tutorials</a></li>
<li><a href="../security.html" title="Security"><span class="none"></span>Security</a></li>
<li><a href="../support.html" title="Support"><span class="none"></span>Support</a></li>
<li><a href="../thanks.html" title="Thanks"><span class="none"></span>Thanks</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/pencil.png" alt="For Contributors" border="0"/> For Contributors</li>
<li><a href="../build.html" title="Building Log4j from Source"><span class="none"></span>Building Log4j from Source</a></li>
<li><a href="../guidelines.html" title="Guidelines"><span class="none"></span>Guidelines</a></li>
<li><a href="../javastyle.html" title="Style Guide"><span class="none"></span>Style Guide</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/book.png" alt="Manual" border="0"/> Manual</li>
<li><a href="../manual/index.html" title="Introduction"><span class="none"></span>Introduction</a></li>
<li><a href="../manual/architecture.html" title="Architecture"><span class="none"></span>Architecture</a></li>
<li><a href="../manual/compatibility.html" title="Log4j 1.x Compatibility"><span class="none"></span>Log4j 1.x Compatibility</a></li>
<li><a href="../manual/migration.html" title="Log4j 1.x Migration"><span class="none"></span>Log4j 1.x Migration</a></li>
<li><a href="../manual/api.html" title="Java API"><span class="icon-chevron-down"></span>Java API</a>
<ul class="nav nav-list">
<li><a href="../manual/logbuilder.html" title="Log Builder"><span class="none"></span>Log Builder</a></li>
<li><a href="../manual/flowtracing.html" title="Flow Tracing"><span class="none"></span>Flow Tracing</a></li>
<li><a href="../manual/markers.html" title="Markers"><span class="none"></span>Markers</a></li>
<li><a href="../manual/eventlogging.html" title="Event Logging"><span class="none"></span>Event Logging</a></li>
<li class="active"><a href="#"><span class="none"></span>Messages</a></li>
<li><a href="../manual/thread-context.html" title="ThreadContext"><span class="none"></span>ThreadContext</a></li>
</ul></li>
<li><a href="../manual/scala-api.html" title="Scala API"><span class="none"></span>Scala API</a></li>
<li><a href="../manual/configuration.html" title="Configuration"><span class="icon-chevron-right"></span>Configuration</a></li>
<li><a href="../manual/usage.html" title="Usage"><span class="icon-chevron-right"></span>Usage</a></li>
<li><a href="../manual/webapp.html" title="Web Applications and JSPs"><span class="icon-chevron-right"></span>Web Applications and JSPs</a></li>
<li><a href="../manual/lookups.html" title="Lookups"><span class="icon-chevron-right"></span>Lookups</a></li>
<li><a href="../manual/appenders.html" title="Appenders"><span class="icon-chevron-right"></span>Appenders</a></li>
<li><a href="../manual/layouts.html" title="Layouts"><span class="icon-chevron-right"></span>Layouts</a></li>
<li><a href="../manual/filters.html" title="Filters"><span class="icon-chevron-right"></span>Filters</a></li>
<li><a href="../manual/async.html" title="Async Loggers"><span class="icon-chevron-right"></span>Async Loggers</a></li>
<li><a href="../manual/garbagefree.html" title="Garbage-free Logging"><span class="icon-chevron-right"></span>Garbage-free Logging</a></li>
<li><a href="../manual/jmx.html" title="JMX"><span class="none"></span>JMX</a></li>
<li><a href="../manual/logsep.html" title="Logging Separation"><span class="none"></span>Logging Separation</a></li>
<li><a href="../manual/extending.html" title="Extending Log4j"><span class="icon-chevron-right"></span>Extending Log4j</a></li>
<li><a href="../manual/plugins.html" title="Plugins"><span class="icon-chevron-right"></span>Plugins</a></li>
<li><a href="../manual/customconfig.html" title="Programmatic Log4j Configuration"><span class="icon-chevron-right"></span>Programmatic Log4j Configuration</a></li>
<li><a href="../manual/customloglevels.html" title="Custom Log Levels"><span class="icon-chevron-right"></span>Custom Log Levels</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/tag.png" alt="Related Projects" border="0"/> Related Projects</li>
<li><a href="http://logging.apache.org/log4j/scala/index.html" class="externalLink" title="Log4j-Scala"><span class="none"></span>Log4j-Scala</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/link.png" alt="Legacy Sites" border="0"/> Legacy Sites</li>
<li><a href="http://logging.apache.org/log4j/1.2/" class="externalLink" title="Log4j 1.2 - End of Life"><span class="none"></span>Log4j 1.2 - End of Life</a></li>
<li><a href="http://logging.apache.org/log4j/log4j-2.3/" class="externalLink" title="Log4j 2.3 - Java 6"><span class="none"></span>Log4j 2.3 - Java 6</a></li>
<li><a href="http://logging.apache.org/log4j/log4j-2.12.1" class="externalLink" title="Log4j 2.12.1 - Java 7"><span class="none"></span>Log4j 2.12.1 - Java 7</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/cog.png" alt="Components" border="0"/> Components</li>
<li><a href="../log4j-api/index.html" title="API"><span class="none"></span>API</a></li>
<li><a href="../log4j-core/index.html" title="Implementation"><span class="none"></span>Implementation</a></li>
<li><a href="../log4j-jcl/index.html" title="Commons Logging Bridge"><span class="none"></span>Commons Logging Bridge</a></li>
<li><a href="../log4j-1.2-api/index.html" title="Log4j 1.2 API"><span class="none"></span>Log4j 1.2 API</a></li>
<li><a href="../log4j-slf4j-impl/index.html" title="SLF4J Binding"><span class="none"></span>SLF4J Binding</a></li>
<li><a href="../log4j-jul/index.html" title="JUL Adapter"><span class="none"></span>JUL Adapter</a></li>
<li><a href="../log4j-jpl/index.html" title="JDK Platform Logger"><span class="none"></span>JDK Platform Logger</a></li>
<li><a href="../log4j-to-slf4j/index.html" title="Log4j 2 to SLF4J Adapter"><span class="none"></span>Log4j 2 to SLF4J Adapter</a></li>
<li><a href="../log4j-flume-ng/index.html" title="Apache Flume Appender"><span class="none"></span>Apache Flume Appender</a></li>
<li><a href="../log4j-taglib/index.html" title="Log4j Tag Library"><span class="none"></span>Log4j Tag Library</a></li>
<li><a href="../log4j-jmx-gui/index.html" title="Log4j JMX GUI"><span class="none"></span>Log4j JMX GUI</a></li>
<li><a href="../log4j-web/index.html" title="Log4j Web Application Support"><span class="none"></span>Log4j Web Application Support</a></li>
<li><a href="../log4j-appserver/index.html" title="Log4j Application Server Integration"><span class="none"></span>Log4j Application Server Integration</a></li>
<li><a href="../log4j-couchdb/index.html" title="Log4j CouchDB appender"><span class="none"></span>Log4j CouchDB appender</a></li>
<li><a href="../log4j-mongodb2/index.html" title="Log4j MongoDB2 appender"><span class="none"></span>Log4j MongoDB2 appender</a></li>
<li><a href="../log4j-mongodb3/index.html" title="Log4j MongoDB3 appender"><span class="none"></span>Log4j MongoDB3 appender</a></li>
<li><a href="../log4j-cassandra/index.html" title="Log4j Cassandra appender"><span class="none"></span>Log4j Cassandra appender</a></li>
<li><a href="../log4j-iostreams/index.html" title="Log4j IO Streams"><span class="none"></span>Log4j IO Streams</a></li>
<li><a href="../log4j-liquibase/index.html" title="Log4j Liquibase Binding"><span class="none"></span>Log4j Liquibase Binding</a></li>
<li><a href="../log4j-docker/index.html" title="Log4j Docker Support"><span class="none"></span>Log4j Docker Support</a></li>
<li><a href="../log4j-spring-cloud-config/log4j-spring-cloud-config-client/index.html" title="Log4j Spring Cloud Config Client"><span class="none"></span>Log4j Spring Cloud Config Client</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/info.png" alt="Project Information" border="0"/> Project Information</li>
<li><a href="../dependency-convergence.html" title="Dependency Convergence"><span class="none"></span>Dependency Convergence</a></li>
<li><a href="../dependency-management.html" title="Dependency Management"><span class="none"></span>Dependency Management</a></li>
<li><a href="../team-list.html" title="Project Team"><span class="none"></span>Project Team</a></li>
<li><a href="../mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a></li>
<li><a href="../issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a></li>
<li><a href="../license.html" title="Project License"><span class="none"></span>Project License</a></li>
<li><a href="../source-repository.html" title="Source Repository"><span class="none"></span>Source Repository</a></li>
<li><a href="../project-summary.html" title="Project Summary"><span class="none"></span>Project Summary</a></li>
<li class="nav-header"><img class="imageLink" src="../img/glyphicons/layers.png" alt="Project Reports" border="0"/> Project Reports</li>
<li><a href="../changes-report.html" title="Changes Report"><span class="none"></span>Changes Report</a></li>
<li><a href="../jira-report.html" title="JIRA Report"><span class="none"></span>JIRA Report</a></li>
<li><a href="../rat-report.html" title="RAT Report"><span class="none"></span>RAT Report</a></li>
</ul>
</nav>
<div class="well sidebar-nav">
<hr />
<div id="poweredBy">
<div class="clear"></div>
<div class="clear"></div>
<div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../images/logos/maven-feather.png" /></a>
</div>
</div>
</header>
<main id="bodyColumn" class="span10" >
<section>
<h2><a name="Log4j_2_API"></a>Log4j 2 API</h2>
<section>
<h3><a name="Messages"></a>Messages</h3>
<a name="Messages"></a>
<p>
Although Log4j 2 provides Logger methods that accept Strings and Objects, all of these are ultimately
captured in Message objects that are then associated with the log event. Applications are free to
construct Messages of their own and pass them to the Logger. Although it may seem more expensive than
passing the message format and parameters directly to the event, testing has shown that with modern
JVMs the cost of creating and destroying events is minor, especially when complex tasks are encapsulated
in the Message instead of the application. In addition, when using the methods that accept Strings and
parameters, the underlying Message object will only be created if any configured global filters
or the Logger's log level allow the message to be processed.
</p>
<p>
Consider an application that has a Map object containing {&quot;Name&quot; = &quot;John Doe&quot;, &quot;Address&quot; = &quot;123 Main
St.&quot;,
&quot;Phone&quot; = &quot;(999) 555-1212&quot;} and a User object that has a getId method that returns &quot;jdoe&quot;. The developer
would like to add an informational message that returns &quot;User John Doe has logged in using id jdoe&quot;. The
way this could be accomplished is by doing:
</p>
<div>
<pre class="prettyprint">logger.info(&quot;User {} has logged in using id {}&quot;, map.get(&quot;Name&quot;), user.getId());</pre></div>
<p>
While there is nothing inherently wrong with this, as the complexity of the objects and desired output
increases this technique becomes harder to use. As an alternative, using Messages allows:
</p>
<div>
<pre class="prettyprint">logger.info(new LoggedInMessage(map, user));</pre></div>
<p>
In this alternative the formatting is delegated to the LoggedInMessage object's getFormattedMessage
method.
Although in this alternative a new object is created, none of the methods on the objects passed to the
LoggedInMessage are invoked until the LoggedInMessage is formatted. This is especially useful when an
Object's toString method does not produce the information you would like to appear in the log.
</p>
<p>
Another advantage to Messages is that they simplify writing Layouts. In other logging frameworks the
Layout must loop through the parameters individually and determine what to do based on what objects
are encountered. With Messages the Layout has the option of delegating the formatting to the Message or
performing its formatting based on the type of Message encountered.
</p>
<p>
Borrowing from the earlier example illustrating Markers to identify SQL statements being logged, Messages
can also be leveraged. First, the Message is defined.
</p>
<div>
<pre class="prettyprint linenums">
public class SQLMessage implements Message {
public enum SQLType {
UPDATE,
QUERY
};
private final SQLType type;
private final String table;
private final Map&lt;String, String&gt; cols;
public SQLMessage(SQLType type, String table) {
this(type, table, null);
}
public SQLMessage(SQLType type, String table, Map&lt;String, String&gt; cols) {
this.type = type;
this.table = table;
this.cols = cols;
}
public String getFormattedMessage() {
switch (type) {
case UPDATE:
return createUpdateString();
break;
case QUERY:
return createQueryString();
break;
default;
}
}
public String getMessageFormat() {
return type + &quot; &quot; + table;
}
public Object getParameters() {
return cols;
}
private String createUpdateString() {
}
private String createQueryString() {
}
private String formatCols(Map&lt;String, String&gt; cols) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (Map.Entry&lt;String, String&gt; entry : cols.entrySet()) {
if (!first) {
sb.append(&quot;, &quot;);
}
sb.append(entry.getKey()).append(&quot;=&quot;).append(entry.getValue());
first = false;
}
return sb.toString();
}
}</pre></div>
<p>
Next we can use the message in our application.
</p>
<div>
<pre class="prettyprint linenums">
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import java.util.Map;
public class MyApp {
private Logger logger = LogManager.getLogger(MyApp.class.getName());
private static final Marker SQL_MARKER = MarkerManager.getMarker(&quot;SQL&quot;);
private static final Marker UPDATE_MARKER = MarkerManager.getMarker(&quot;SQL_UPDATE&quot;, SQL_MARKER);
private static final Marker QUERY_MARKER = MarkerManager.getMarker(&quot;SQL_QUERY&quot;, SQL_MARKER);
public String doQuery(String table) {
logger.entry(param);
logger.debug(QUERY_MARKER, new SQLMessage(SQLMessage.SQLType.QUERY, table));
return logger.exit();
}
public String doUpdate(String table, Map&lt;String, String&gt; params) {
logger.entry(param);
logger.debug(UPDATE_MARKER, new SQLMessage(SQLMessage.SQLType.UPDATE, table, parmas);
return logger.exit();
}
}</pre></div>
<p>
Notice that in contrast to the prior version of this example, the logger.debug in doUpdate no longer
needs to be wrapped in an isDebugEnabled call as creation of the SQLMessage is on the same order of
magnitude of performing that check. Furthermore, all the formatting of the SQL columns is now hidden
in the SQLMessage instead of having to take place in the business logic. Finally, if desired, Filters
and/or Layouts can be written to take special action when an SQLMessage is encountered.
</p>
<section>
<h4><a name="FormattedMessage"></a>FormattedMessage</h4>
<a name="FormattedMessage"></a>
<p>
The message pattern passed to a
<a href="../log4j-api/apidocs/org/apache/logging/log4j/message/FormattedMessage.html" class="javadoc">FormattedMessage</a>
is first checked to see if it is a valid java.text.MessageFormat pattern. If it is, a MessageFormatMessage is
used to format it. If not it is next checked to see if it contains any tokens that are valid format
specifiers for String.format(). If so, a StringFormattedMessage is used to format it. Finally, if the
pattern doesn't match either of those then a ParameterizedMessage is used to format it.
</p>
</section><section>
<h4><a name="LocalizedMessage"></a>LocalizedMessage</h4>
<a name="LocalizedMessage"></a>
<p>
<a href="../log4j-api/apidocs/org/apache/logging/log4j/message/LocalizedMessage.html" class="javadoc">LocalizedMessage</a>
is provided primarily to provide compatibility with Log4j 1.x. Generally,
the best approach to localization is to have the client UI render the events in the client's locale.
</p>
<p>
LocalizedMessage incorporates a ResourceBundle and allows the message pattern parameter to be the key to
the message pattern in the bundle. If no bundle is specified,
LocalizedMessage will attempt to locate a bundle with the name of the Logger used to log the event. The
message retrieved from the bundle will be formatted using a FormattedMessage.
</p>
</section><section>
<h4><a name="LoggerNameAwareMessage"></a>LoggerNameAwareMessage</h4>
<a name="LoggerNameAwareMessage"></a>
<p>
LoggerNameAwareMessage is an interface with a setLoggerName method. This method will be called during
event construction so that the Message has the name of the Logger used to log the event when the
message is being formatted.
</p>
</section><section>
<h4><a name="MapMessage"></a>MapMessage</h4>
<a name="MapMessage"></a>
<p>
A MapMessage contains a Map of String keys and values. MapMessage implements
FormattedMessage and accepts format specifiers of &quot;XML&quot;, &quot;JSON&quot; or &quot;JAVA&quot;, in which case the Map
will be formatted as XML, JSON or as documented by
<a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.html#toString()">java.util.AbstractMap.toString()</a>.
Otherwise, the Map will be formatted as &quot;key1=value1 key2=value2 ...&quot;.
</p>
<p>
Some Appenders make special use of MapMessage objects:
</p>
<ul>
<li>
When a <a href="appenders.html#JMSAppender">JMS Appender</a> is configured with a MessageLayout, it converts a Log4j
MapMessage to a JMS javax.jms.MapMessage.
</li>
<li>
When a <a href="appenders.html#JDBCAppender">JDBC Appender</a> is configured with a MessageLayout, it converts a Log4j
MapMessage to values in a SQL INSERT statement.
</li>
<li>
When a <a href="appenders.html#NoSQLAppenderMongoDB2">MongoDB2 Appender</a> or
<a href="appenders.html#NoSQLAppenderMongoDB3">MongoDB3 Appender</a> is configured with a MessageLayout, it converts a Log4j
MapMessage to fields in a MongoDB object.
</li>
</ul>
<p>
When an Appender is MessageLayout-aware, the object Log4j sends to target is not a Log4j Log
Event but a custom object.
</p>
</section><section>
<h4><a name="MessageFormatMessage"></a>MessageFormatMessage</h4>
<a name="MessageFormatMessage"></a>
<p>
<a href="../log4j-api/apidocs/org/apache/logging/log4j/message/MessageFormatMessage.html" class="javadoc">MessageFormatMessage</a>
handles messages that use a <a class="externalLink" href="https://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html">conversion format</a>.
While this Message has more flexibility than ParameterizedMessage, it is also about two times slower.
</p>
</section><section>
<h4><a name="MultiformatMessage"></a>MultiformatMessage</h4>
<a name="MultiformatMessage"></a>
<p>
A MultiformatMessage will have a getFormats method and a getFormattedMessage method that accepts and array
of format Strings. The getFormats method may be called by a Layout to provide it information on what
formatting options the Message supports. The Layout may then call getFormattedMessage with one or more
for the formats. If the Message doesn't recognize the format name it will simply format the data using its
default format. An example of this is the StructuredDataMessage which accepts a format String of &quot;XML&quot;
which will cause it to format the event data as XML instead of the RFC 5424 format.
</p>
</section><section>
<h4><a name="ObjectMessage"></a>ObjectMessage</h4>
<a name="ObjectMessage"></a>
<p>
Formats an Object by calling its toString method. Since Log4j 2.6, Layouts trying to be low-garbage or
garbage-free will call the formatTo(StringBuilder) method instead.
</p>
</section><section>
<h4><a name="ParameterizedMessage"></a>ParameterizedMessage</h4>
<a name="ParameterizedMessage"></a>
<p>
<a href="../log4j-api/apidocs/org/apache/logging/log4j/message/ParameterizedMessage.html" class="javadoc">ParameterizedMessage</a>
handles messages that contain &quot;{}&quot; in the format to represent replaceable tokens and the replacement
parameters.
</p>
</section><section>
<h4><a name="ReusableObjectMessage"></a>ReusableObjectMessage</h4>
<a name="ReusableObjectMessage"></a>
<p>
In garbage-free mode, this message is used to pass logged Objects to the Layout and Appenders.
Functionally equivalent to <a href="#ObjectMessage">ObjectMessage</a>.
</p>
</section><section>
<h4><a name="ReusableParameterizedMessage"></a>ReusableParameterizedMessage</h4>
<a name="ReusableParameterizedMessage"></a>
<p>
In garbage-free mode, this message is used to handle messages that contain &quot;{}&quot; in the format to
represent replaceable tokens and the replacement parameters.
Functionally equivalent to <a href="#ParameterizedMessage">ParameterizedMessage</a>.
</p>
</section><section>
<h4><a name="ReusableSimpleMessage"></a>ReusableSimpleMessage</h4>
<a name="ReusableSimpleMessage"></a>
<p>
In garbage-free mode, this message is used to pass logged Strings and CharSequences to the Layout and Appenders.
Functionally equivalent to <a href="#SimpleMessage">SimpleMessage</a>.
</p>
</section><section>
<h4><a name="SimpleMessage"></a>SimpleMessage</h4>
<a name="SimpleMessage"></a>
<p>
SimpleMessage contains a String or CharSequence that requires no formatting.
</p>
</section><section>
<h4><a name="StringFormattedMessage"></a>StringFormattedMessage</h4>
<a name="StringFormattedMessage"></a>
<p>
<a href="../log4j-api/apidocs/org/apache/logging/log4j/message/StringFormattedMessage.html" class="javadoc">StringFormattedMessage</a>
handles messages that use a <a class="externalLink" href="https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">conversion format</a>
that is compliant with <a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format(java.lang.String, java.lang.Object...)">java.lang.String.format()</a>.
While this Message has more flexibility than ParameterizedMessage, it is also 5 to 10 times slower.
</p>
</section><section>
<h4><a name="StructuredDataMessage"></a>StructuredDataMessage</h4>
<a name="StructuredDataMessage"></a>
<p>
<a href="../log4j-api/apidocs/org/apache/logging/log4j/message/StructuredDataMessage.html" class="javadoc">StructuredDataMessage</a>
allows applications to add items to a Map as well as set the id to allow a message to be formatted as a
Structured Data element in accordance with <a class="externalLink" href="http://tools.ietf.org/html/rfc5424">RFC 5424</a>.
</p>
</section><section>
<h4><a name="ThreadDumpMessage"></a>ThreadDumpMessage</h4>
<a name="ThreadDumpMessage"></a>
<p>
A ThreadDumpMessage, if logged, will generate stack traces for all threads.
The stack traces will include any locks that are held.
</p>
</section><section>
<h4><a name="TimestampMessage"></a>TimestampMessage</h4>
<a name="TimestampMessage"></a>
<p>
A TimestampMessage will provide a getTimestamp method that is called during event construction. The
timestamp in the Message will be used in lieu of the current timestamp.
</p>
</section></section>
</section>
</main>
</div>
</div>
<hr/>
<footer>
<div class="container-fluid">
<div class="row-fluid">
<p align="center">Copyright &copy; 1999-2020 <a class="external" href="http://www.apache.org">The Apache Software Foundation</a>. All Rights Reserved.<br>
Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.</p>
</div>
</div>
</footer>
</body>
</html>