<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
   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.
-->
<!-- Generated by Apache Maven Doxia at 2019-01-16 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>log4cxx -
		How to use Apache log4cxx - Apache log4cxx</title>
		<link rel="stylesheet" href="./css/bootstrap.min.css" type="text/css" />
		<link rel="stylesheet" href="./css/site.css" type="text/css" />
		<script type="text/javascript" src="./js/jquery.min.js"></script>
		<script type="text/javascript" src="./js/bootstrap.min.js"></script>
		<script type="text/javascript" src="./js/prettify.min.js"></script>
		<script type="text/javascript" src="./js/site.js"></script>
		<meta name="Date-Revision-yyyymmdd" content="20190116" />
		<meta http-equiv="Content-Language" content="en" />

				</head>
	<body class="composite">
		<a href="https://logging.apache.org/">
			<img class="logo-left" src="./images/logos/ls-logo.jpg" alt="Apache logging services logo" />
		</a>
		<img class="logo-right" src="./images/logos/logo.png" alt="Apache log4j logo" />
		<div class="clear"></div>

		<div class="navbar">
			<div class="navbar-inner">
				<div class="container-fluid">
					<a class="brand" href="http://logging.apache.org/log4cxx">Apache log4cxx &#8482;</a>
						<ul class="nav">
						<li>


				<a href="https://wiki.apache.org/logging" class="external" target="_blank" title="Logging Wiki">Logging Wiki</a>
			</li>
					<li>


				<a href="https://www.apache.org/" class="external" target="_blank" title="Apache">Apache</a>
			</li>
					<li>


				<a href="https://logging.apache.org/" class="external" target="_blank" title="Logging Services">Logging Services</a>
			</li>
					<li>


				<a href="https://github.com/apache/logging-log4cxx" class="external" target="_blank" title="GitHub">GitHub</a>
			</li>
		</ul>

					<div class="pull-right">


						<span id="publishDate">Last Published: 2019-01-16</span>
							<span class="divider">|</span> <span id="projectVersion">Version: 0.10.0</span>
											</div>
				</div>
			</div>
		</div>

		<div class="container-fluid">
			<table class="layout-table">
				<tr>
					<td class="sidebar">
						<div class="well sidebar-nav">
										<ul class="nav nav-list">
		 											 <li class="nav-header"><i class="icon-home"></i>About</li>
																						<li class="none">
									<a href="index.html" title="What is log4cxx?">What is log4cxx?</a>
					</li>
 																<li class="none">
									<a href="project-info.html" title="Project Information">Project Information</a>
					</li>
 																<li class="none">
									<a href="project-reports.html" title="Generated Reports">Generated Reports</a>
					</li>
 								</ul>
			<ul class="nav nav-list">
		 											 <li class="nav-header"><i class="icon-book"></i>Usage</li>
																							<li class="none active">
									<a href="usage.html" title="How to use log4cxx?">How to use log4cxx?</a>
					</li>
 																<li class="none">
									<a href="apidocs/index.html" title="API Documentation">API Documentation</a>
					</li>
 																<li class="none">
									<a href="faq.html" title="FAQ">FAQ</a>
					</li>
 								</ul>
			<ul class="nav nav-list">
		 											 <li class="nav-header"><i class="icon-cog"></i>Get</li>
																						<li class="none">
									<a href="download.html" title="Download">Download</a>
					</li>
 																<li class="none">
									<a href="changes-report.html" title="Changes">Changes</a>
					</li>
 																<li class="none">
									<a href="license.html" title="License">License</a>
					</li>
 								</ul>
			<ul class="nav nav-list">
		 											 <li class="nav-header"><i class="icon-pencil"></i>Community</li>
																						<li class="none">
									<a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
					</li>
 																<li class="none">
									<a href="issue-tracking.html" title="Issue Tracking">Issue Tracking</a>
					</li>
 																<li class="none">


				<a href="http://wiki.apache.org/logging-log4cxx" class="external" target="_blank" title="Wiki">Wiki</a>
					</li>
 								</ul>
			<ul class="nav nav-list">
		 											 <li class="nav-header"><i class="icon-pencil"></i>Development</li>
																						<li class="none">
									<a href="source-repository.html" title="Repository">Repository</a>
					</li>
 																<li class="none">
									<a href="dependencies.html" title="Dependencies">Dependencies</a>
					</li>
 																																																																										<li class="expanded">
									<a href="building/index.html" title="Building">Building</a>
										<ul>
																			<li class="none">
									<a href="building/autotools.html" title="autotools">autotools</a>
					</li>
 																				<li class="none">
									<a href="building/ant.html" title="Apache Ant">Apache Ant</a>
					</li>
 																				<li class="none">
									<a href="building/maven.html" title="Apache Maven 2">Apache Maven 2</a>
					</li>
 																				<li class="none">
									<a href="building/vstudio.html" title="Microsoft Visual Studio">Microsoft Visual Studio</a>
					</li>
 																				<li class="none">
									<a href="building/xcode.html" title="Apple Xcode">Apple Xcode</a>
					</li>
 										</ul>
							</li>
 								</ul>
			<ul class="nav nav-list">
		 											 <li class="nav-header"><i class="icon-info-sign"></i>Apache</li>
																						<li class="none">


				<a href="http://www.apache.org" class="external" target="_blank" title="Home">Home</a>
					</li>
 																<li class="none">


				<a href="http://www.apache.org/foundation/sponsorship.html" class="external" target="_blank" title="Sponsorship">Sponsorship</a>
					</li>
 																<li class="none">


				<a href="http://www.apache.org/foundation/thanks.html" class="external" target="_blank" title="Thanks">Thanks</a>
					</li>
 																<li class="none">


				<a href="http://www.apachecon.com" class="external" target="_blank" title="Conferences">Conferences</a>
					</li>
 								</ul>
							</div>
						<div id="poweredBy">
															<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
				<img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
			</a>
									</div>
					</td>
					<td class="content">
						<!-- 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. -->

		<div class="section">
<h2>Loggers<a name="Loggers"></a></h2>

<p>
				Log4cxx has three main components: <i>loggers</i>,
				<i>appenders</i> and <i>layouts</i>. These three types of
				components work together to enable developers to log messages according
				to message type and level, and to control at runtime how these
				messages are formatted and where they are reported.
			</p>


<div class="section">
<h3>Hierarchy<a name="Hierarchy"></a></h3>

<p>
					The first and foremost advantage of any logging API over plain
					<tt>std::cout</tt> resides in its ability to disable
					certain log statements while allowing others to print unhindered. This
					capability assumes that the logging space, that is, the space of all
					possible logging statements, is categorized according to some
					developer-chosen criteria.
				</p>


<p>
					Loggers are named entities. Logger names are case-sensitive and
					they follow the hierarchical naming rule:
				</p>


<dl>

<dt><b>Named Hierarchy</b></dt>

<dd>
						A logger is said to be an <i>ancestor</i> of another
						logger if its name followed by a dot is a prefix of the
						<i>descendant</i> logger name. A logger is said to be a
						<i>parent</i> of a <i>child</i> logger if there are no
						ancestors between itself and the descendant logger.
					</dd>
				</dl>


<p>
					For example, the logger named <tt>&quot;com.foo&quot;</tt> is a parent
					of the logger named <tt>&quot;com.foo.Bar&quot;</tt>.  Similarly,
					<tt>&quot;java&quot;</tt> is a parent of <tt>&quot;java.util&quot;</tt> and an
					ancestor of <tt>&quot;java.util.Vector&quot;</tt>. This naming scheme
					should be familiar to most developers.
				</p>


<p>
					The root logger resides at the top of the logger hierarchy. It
					is exceptional in two ways:
				</p>


<ol style="list-style-type: decimal">

<li> it always exists,</li>

<li> it cannot be retrieved by name.</li>
				</ol>


<p>
					Invoking the class static <a href="apidocs/classlog4cxx_1_1_logger.html#afc0e4d99cab7c38a2851d41e6edc1dee">log4cxx::Logger::getRootLogger</a>
					method retrieves it. All other loggers are instantiated and retrieved with the class static
					<a href="apidocs/classlog4cxx_1_1_logger.html#a76017df17da02bc11bfe50e47de703a3">log4cxx::Logger::getLogger</a>
					method. This method takes the name of the desired logger as a parameter. Some of the basic methods in the Logger
					class are listed below.
				</p>


<div>
<pre class="prettyprint linenums">
namespace log4cxx {
	class <b>Logger</b> {
		public:
			// Creation &amp; retrieval methods:
			static LoggerPtr getRootLogger();
			static LoggerPtr getLogger(const std::string&amp; name);
			static LoggerPtr getLogger(const std::wstring&amp; name);
	}
}

//
// Use these macros instead of calling Logger methods directly.
// Macros will handle char or wchar_t pointers or strings
// or most right-hand side expressions of an
// std::basic_string::operator&lt;&lt;.
//
#define LOG4CXX_TRACE(logger, expression) ...
#define LOG4CXX_DEBUG(logger, expression) ...
#define LOG4CXX_INFO(logger, expression) ...
#define LOG4CXX_WARN(logger, expression) ...
#define LOG4CXX_ERROR(logger, expression) ...
#define LOG4CXX_FATAL(logger, expression) ...</pre></div>
			</div>


<div class="section">
<h3>Levels<a name="Levels"></a></h3>

<p>
					Loggers <i>may</i> be assigned levels. The pre-defined
					levels: TRACE, DEBUG, INFO, WARN, ERROR and FATAL are defined in the
					<tt><a href="apidocs/classlog4cxx_1_1_level.html">log4cxx::Level</a></tt>
					class which provides accessor functions.
				</p>


<p>
					If a given logger is not assigned a level, then it inherits
					one from its closest ancestor with an assigned level. More
					formally:
				</p>


<dl>

<dt><b>Level Inheritance</b></dt>


<dd>
						The <i>inherited level</i> for a given logger <i>C</i>, is equal to the
						first non-null level in the logger hierarchy, starting at <i>C</i> and
						proceeding upwards in the hierarchy towards the <tt>root</tt> logger.
					</dd>
				</dl>


<p>
					To ensure that all loggers can eventually inherit a level,
					the root logger always has an assigned level.
				</p>


<p>
					Below are four tables with various assigned level values and the
					resulting inherited levels according to the above rule.
				</p>


<table class="bodyTable" border="1"><caption align="bottom">Example 1</caption>

<tr class="a">

<th>Logger name</th>

<th>Assigned level</th>

<th>Inherited level</th>
					</tr>

<tr class="b" align="left">

<td>root</td>

<td>Proot</td>

<td>Proot</td>
					</tr>

<tr class="a" align="left">

<td>X </td>

<td>none</td>

<td>Proot</td>
					</tr>

<tr class="b" align="left">

<td>X.Y </td>

<td>none</td>

<td>Proot</td>
					</tr>

<tr class="a" align="left">

<td>X.Y.Z</td>

<td>none</td>

<td>Proot</td>
					</tr>

				</table>


<p>
					In example 1 above, only the root logger is assigned a
					level. This level value, <tt>Proot</tt>, is inherited by the
					other loggers <tt>X</tt>, <tt>X.Y</tt> and
					<tt>X.Y.Z</tt>.
				</p>


<table class="bodyTable" border="1"><caption align="bottom">Example 2</caption>

<tr class="a">

<th>Logger name</th>

<th>Assigned level</th>

<th>Inherited level</th>
					</tr>

<tr class="b" align="left">

<td>root</td>

<td>Proot</td>

<td>Proot</td>
					</tr>

<tr class="a" align="left">

<td>X </td>

<td>Px</td>

<td>Px</td>
					</tr>

<tr class="b" align="left">

<td>X.Y </td>

<td>Pxy</td>

<td>Pxy</td>
					</tr>

<tr class="a" align="left">

<td>X.Y.Z</td>

<td>Pxyz</td>

<td>Pxyz</td>
					</tr>

				</table>


<p>
					In example 2, all loggers have an assigned level value. There
					is no need for level inheritence.
				</p>


<table class="bodyTable" border="1"><caption align="bottom">Example 3</caption>

<tr class="a">

<th>Logger name</th>

<th>Assigned level</th>

<th>Inherited level</th>
					</tr>

<tr class="b" align="left">

<td>root</td>

<td>Proot</td>

<td>Proot</td>
					</tr>

<tr class="a" align="left">

<td>X </td>

<td>Px</td>

<td>Px</td>
					</tr>

<tr class="b" align="left">

<td>X.Y </td>

<td>none</td>

<td>Px</td>
					</tr>

<tr class="a" align="left">

<td>X.Y.Z</td>

<td>Pxyz</td>

<td>Pxyz</td>
					</tr>

				</table>


<p>
					In example 3, the loggers <tt>root</tt>, <tt>X</tt> and
					<tt>X.Y.Z</tt> are assigned the levels <tt>Proot</tt>,
					<tt>Px</tt> and <tt>Pxyz</tt> respectively. The logger
					<tt>X.Y</tt> inherits its level value from its parent
					<tt>X</tt>.
				</p>


<table class="bodyTable" border="1"><caption align="bottom">Example 4</caption>

<tr class="a">

<th>Logger name</th>

<th>Assigned level</th>

<th>Inherited level</th>
					</tr>

<tr class="b" align="left">

<td>root</td>

<td>Proot</td>

<td>Proot</td>
						</tr>

<tr class="a" align="left">

<td>X </td>

<td>Px</td>

<td>Px</td>
					</tr>

<tr class="b" align="left">

<td>X.Y </td>

<td>none</td>

<td>Px</td>
					</tr>

<tr class="a" align="left">

<td>X.Y.Z</td>

<td>none</td>

<td>Px</td>
					</tr>

				</table>


<p>
					In example 4, the loggers <tt>root</tt> and <tt>X</tt>
					and are assigned the levels <tt>Proot</tt> and <tt>Px</tt>
					respectively. The loggers <tt>X.Y</tt> and <tt>X.Y.Z</tt>
					inherits their level value from their nearest parent <tt>X</tt>
					having an assigned level.
				</p>
			</div>


<div class="section">
<h3>Requests<a name="Requests"></a></h3>

<p>
					Logging requests are made by invoking a method of
					a logger instance, preferrably through the use of LOG4CXX_INFO or similar
					macros which support short-circuiting if the threshold is not satisfied
					and use of the insertion operator (&lt;&lt;) in the message parameter.
				</p>


<div>
<pre class="prettyprint linenums">
log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger(<b>&quot;com.foo&quot;</b>));
const char* region = &quot;World&quot;;
LOG4CXX_INFO(logger, &quot;Simple message text.&quot;)
LOG4CXX_INFO(logger, &quot;Hello, &quot; &lt;&lt; region)
LOG4CXX_DEBUG(logger, L&quot;Iteration &quot; &lt;&lt; i)
LOG4CXX_DEBUG(logger, &quot;e^10 = &quot; &lt;&lt; std::scientific &lt;&lt; exp(10.0))
//
// Use a wchar_t first operand to force use of wchar_t based stream.
//
LOG4CXX_WARN(logger, L&quot;&quot; &lt;&lt; i &lt;&lt; L&quot; is the number of the iteration.&quot;)</pre></div>


<p>
					A logging request is said to be <i>enabled</i> if its level is
					higher than or equal to the level of its logger. Otherwise, the
					request is said to be <i>disabled</i>. A logger without an
					assigned level will inherit one from the hierarchy. This rule is
					summarized below.
				</p>


<dl>

<dt><b>Basic Selection Rule</b></dt>


<dd>
						A log request of level <i>p</i> in a logger with (either assigned or
						inherited, whichever is appropriate) level <i>q</i>, is enabled if
						<i>p &gt;= q</i>.
					</dd>
				</dl>


<p>
					This rule is at the heart of log4cxx. It assumes that levels are
					ordered. For the standard levels, we have <tt>TRACE &lt; DEBUG &lt; INFO
					&lt; WARN &lt; ERROR &lt; FATAL</tt>.
				</p>


<p>
					Here is an example of this rule.
				</p>


<div>
<pre class="prettyprint linenums">
// get a logger instance named &quot;com.foo&quot;
log4cxx::LoggerPtr  logger(log4cxx::Logger::getLogger(<b>&quot;com.foo&quot;</b>));

// Now set its level. Normally you do not need to set the
// level of a logger programmatically. This is usually done
// in configuration files.
<b>logger</b>-&gt;setLevel(<b>log4cxx::Level::getInfo()</b>);

log4cxx::LoggerPtr barlogger(log4cxx::Logger::getLogger(<b>&quot;com.foo.Bar&quot;</b>));

// This request is enabled, because <b>WARN</b> &gt;= <b>INFO</b>.
LOG4CXX_WARN(logger, &quot;Low fuel level.&quot;)

// This request is disabled, because <b>DEBUG</b> &lt; <b>INFO</b>.
LOG4CXX_DEBUG(logger, &quot;Starting search for nearest gas station.&quot;)

// The logger instance barlogger, named &quot;com.foo.Bar&quot;,
// will inherit its level from the logger named
// &quot;com.foo&quot; Thus, the following request is enabled
// because <b>INFO</b> &gt;= <b>INFO</b>.
LOG4CXX_INFO(barlogger. &quot;Located nearest gas station.&quot;)

// This request is disabled, because <b>DEBUG</b> &lt; <b>INFO</b>.
LOG4CXX_DEBUG(barlogger, &quot;Exiting gas station search&quot;)</pre></div>


<p>
					Calling the <tt>getLogger</tt> method with the same name will
					always return a reference to the exact same logger object.
				</p>


<p>
					For example, in
				</p>


<div>
<pre class="prettyprint linenums">
log4cxx::LoggerPtr x = log4cxx::Logger::getLogger(&quot;wombat&quot;);
log4cxx::LoggerPtr y = log4cxx::Logger::getLogger(&quot;wombat&quot;);</pre></div>

<p>
					<tt>x</tt> and <tt>y</tt> refer to <i>exactly</i> the same logger object.
				</p>


<p>
					Thus, it is possible to configure a logger and then to retrieve
					the same instance somewhere else in the code without passing around
					references. In fundamental contradiction to biological parenthood,
					where parents always preceed their children, log4cxx loggers can be
					created and configured in any order. In particular, a &quot;parent&quot;
					logger will find and link to its descendants even if it is
					instantiated after them.
				</p>


<p>
					Configuration of the log4cxx environment is typically done at
					application initialization. The preferred way is by reading a
					configuration file. This approach will be discussed shortly.
				</p>


<p>
					Log4cxx makes it easy to name loggers by <i>software
					component</i>.  This can be accomplished by statically instantiating
					a logger in each class, with the logger name equal to the fully
					qualified name of the class. This is a useful and straightforward
					method of defining loggers. As the log output bears the name of the
					generating logger, this naming strategy makes it easy to identify
					the origin of a log message.  However, this is only one possible,
					albeit common, strategy for naming loggers. Log4cxx does not restrict
					the possible set of loggers. The developer is free to name the
					loggers as desired.
				</p>


<p>
					Nevertheless, naming loggers after the class where they are
					located seems to be the best strategy known so far.
				</p>
			</div>
		</div>


<div class="section">
<h2>Appenders and Layouts<a name="Appenders_and_Layouts"></a></h2>

<p>
				The ability to selectively enable or disable logging requests based
				on their logger is only part of the picture. Log4cxx allows logging
				requests to print to multiple destinations. In log4cxx speak, an output
				destination is called an <i>appender</i>. Currently, appenders exist
				for the <a href="apidocs/classlog4cxx_1_1_console_appender.html">console</a>,
				<a href="apidocs/classlog4cxx_1_1_file_appender.html">files</a>, GUI
				components, <a href="apidocs/classlog4cxx_1_1net_1_1_socket_appender.html">remote socket</a>
				servers, <a href="apidocs/classlog4cxx_1_1nt_1_1_n_t_event_log_appender.html"> NT Event Loggers</a>, and remote UNIX
				<a href="apidocs/classlog4cxx_1_1net_1_1_syslog_appender.html">Syslog</a>
				daemons. It is also possible to log <a href="apidocs/classlog4cxx_1_1_async_appender.html">asynchronously</a>.
			</p>


<p>More than one appender can be attached to a logger.</p>


<p>
				The <a href="apidocs/classlog4cxx_1_1_logger.html#a7c0629acee8dbd1251474bea15d7c9e2">addAppender</a>
				method adds an appender to a given logger.

				<b>
					Each enabled logging request for a given logger will be forwarded to all the
					appenders in that logger as well as the appenders higher in the hierarchy.
				</b>
				In other words, appenders are inherited additively from the logger hierarchy.
				For example, if a console appender is added to the root logger, then all enabled
				logging requests will at least print on the console. If in addition a file appender
				is added to a logger, say <i>C</i>, then enabled logging requests for <i>C</i> and
				<i>C</i>'s children will print on a file <i>and</i> on the console. It is possible
				to override this default behavior so that appender accumulation is no longer additive
				by <a href="apidocs/classlog4cxx_1_1_logger.html#a80f9397947dba9071ad485f178257c17">setting the additivity flag</a> to
				<tt>false</tt>.
			</p>


<p>The rules governing appender additivity are summarized below.</p>


<dl>

<dt><b>Appender Additivity</b></dt>


<dd>
					The output of a log statement of logger <i>C</i> will go to all the appenders
					in <i>C</i> and its ancestors. This is the meaning of the term &quot;appender
					additivity&quot;. However, if an ancestor of logger <i>C</i>, say <i>P</i>, has the
					additivity flag set to <tt>false</tt>, then <i>C</i>'s output will be
					directed to all the appenders in <i>C</i> and it's ancestors up to and
					including <i>P</i> but, not the appenders in any of the ancestors of <i>P</i>.
					<br /><br />
					Loggers have their additivity flag set to <tt>true</tt> by default.
				</dd>
			</dl>


<p>The table below shows an example:</p>


<table class="bodyTable" align="center" border="3" cellpadding="10">

<tr class="a">

<th>Logger Name </th>

<th>Added Appenders</th>

<th>Additivity Flag</th>

<th>Output Targets</th>

<th>Comment</th>
				</tr>

<tr class="b">

<td>root</td>

<td>A1</td>

<td>not applicable</td>

<td>A1</td>

<td>
						The root logger is anonymous but can be accessed with the
						log4cxx::Logger::getRootLogger() method. There is no default appender
						attached to root.
					</td>
				</tr>

<tr class="a">

<td>x</td>

<td>A-x1, A-x2</td>

<td>true</td>

<td>A1, A-x1, A-x2</td>

<td>Appenders of &quot;x&quot; and root.</td>
				</tr>

<tr class="b">

<td>x.y</td>

<td>none</td>

<td>true</td>

<td>A1, A-x1, A-x2</td>

<td>Appenders of &quot;x&quot; and root.</td>
				</tr>

<tr class="a">

<td>x.y.z</td>

<td>A-xyz1</td>

<td>true</td>

<td>A1, A-x1, A-x2, A-xyz1</td>

<td>Appenders in &quot;x.y.z&quot;, &quot;x&quot; and root.</td>
				</tr>

<tr class="b">

<td>security</td>

<td>A-sec</td>

<td>
						<span class="activity-flag-highlight">false</span>
					</td>

<td>A-sec</td>

<td>
						No appender accumulation since the additivity flag is set to <tt>false</tt>.
					</td>
				</tr>

<tr class="a">

<td>security.access</td>

<td>none</td>

<td>true</td>

<td>A-sec</td>

<td>
						Only appenders of &quot;security&quot; because the additivity flag in &quot;security&quot; is
						set to <tt>false</tt>.
					</td>
				</tr>
			</table>


<p>
				More often than not, users wish to customize not only the output
				destination but also the output format. This is accomplished by
				associating a <i>layout</i> with an appender. The layout is
				responsible for formatting the logging request according to the user's
				wishes, whereas an appender takes care of sending the formatted output
				to its destination.
			</p>


<p>
				The <a href="apidocs/classlog4cxx_1_1_pattern_layout.html">PatternLayout</a>, part
				of the standard log4cxx distribution, lets the user specify the output
				format according to conversion patterns similar to the C language
				<tt>printf</tt> function.
			</p>


<p>
				For example, the PatternLayout with the conversion pattern &quot;%r [%t]
				%-5p %c - %m%n&quot; will output something akin to:
			</p>


<div>
<pre class="prettyprint linenums">
176 [main] INFO org.foo.Bar - Located nearest gas station.</pre></div>


<p>
				The first field is the number of milliseconds elapsed since the
				start of the program.  The second field is the thread making the log
				request.  The third field is the level of the log statement. The
				fourth field is the name of the logger associated with the log
				request. The text after the '-' is the message of the statement.
			</p>
		</div>


<div class="section">
<h2>Configuration<a name="Configuration"></a></h2>

<p>
				Inserting log requests into the application code requires a fair
				amount of planning and effort. Observation shows that approximately 4
				percent of code is dedicated to logging. Consequently, even moderately
				sized applications will have thousands of logging statements embedded
				within their code.  Given their number, it becomes imperative to
				manage these log statements without the need to modify them manually.
			</p>


<p>
				The log4cxx environment is fully configurable programmatically.
				However, it is far more flexible to configure log4cxx using
				configuration files.  Currently, configuration files can be written in
				XML or in Java properties (key=value) format.
			</p>


<p>
				Let us give a taste of how this is done with the help of an
				imaginary application <tt>MyApp</tt> that uses log4cxx.
			</p>


<div>
<pre class="prettyprint linenums">
#include &quot;com/foo/bar.h&quot;
using namespace com::foo;

// include log4cxx header files.
#include &quot;log4cxx/logger.h&quot;
#include &quot;log4cxx/basicconfigurator.h&quot;
#include &quot;log4cxx/helpers/exception.h&quot;

using namespace log4cxx;
using namespace log4cxx::helpers;

LoggerPtr logger(Logger::getLogger(&quot;MyApp&quot;));

int main(int argc, char **argv)
{
	int result = EXIT_SUCCESS;
	try
	{
		// Set up a simple configuration that logs on the console.
		BasicConfigurator::configure();

		LOG4CXX_INFO(logger, &quot;Entering application.&quot;)
		Bar bar;
		bar.doIt();
		LOG4CXX_INFO(logger, &quot;Exiting application.&quot;)
	}
	catch(Exception&amp;)
	{
		result = EXIT_FAILURE;
	}

	return result;
}</pre></div>


<p>
				<tt>MyApp</tt> begins by including log4cxx headers. It
				then defines a static logger variable with the name <tt>MyApp</tt>
				which happens to be the fully qualified name of the
				class.
			</p>


<p>
				<tt>MyApp</tt> uses the <tt>Bar</tt> class defined in header
				file <tt>com/foo/bar.h</tt>.
			</p>


<div>
<pre class="prettyprint linenums">
// file com/foo/bar.h
#include &quot;log4cxx/logger.h&quot;

namespace com {
	namespace foo {
		class Bar {
			static log4cxx::LoggerPtr logger;

			public:
				void doIt();
		}
	}
}</pre></div>


<div>
<pre class="prettyprint linenums">
// file bar.cpp
#include &quot;com/foo/bar.h&quot;

using namespace com::foo;
using namespace log4cxx;

LoggerPtr Bar::logger(Logger::getLogger(&quot;com.foo.bar&quot;));

void Bar::doIt() {
	LOG4CXX_DEBUG(logger, &quot;Did it again!&quot;)
}</pre></div>


<p>
				The invocation of the <a href="apidocs/classlog4cxx_1_1_basic_configurator.html#a4f96a09e1372664e3556ce94ace4a70c">BasicConfigurator::configure</a>
				method creates a rather simple log4cxx setup. This method is hardwired
				to add to the root logger a <a href="apidocs/classlog4cxx_1_1_console_appender.html">
				ConsoleAppender</a>. The output will be formatted using a
				<a href="apidocs/classlog4cxx_1_1_pattern_layout.html">PatternLayout</a> set
				to the pattern &quot;%-4r [%t] %-5p %c %x - %m%n&quot;.
			</p>


<p>
				Note that by default, the root logger is assigned to
				<tt>Level::getDebug()</tt>.
			</p>


<p>
				The output of MyApp is:
			</p>


<div>
<pre class="prettyprint linenums">
0    [12345] INFO  MyApp  - Entering application.
36   [12345] DEBUG com.foo.Bar  - Did it again!
51   [12345] INFO  MyApp  - Exiting application.</pre></div>


<p>
				The previous example always outputs the same log information.
				Fortunately, it is easy to modify <tt>MyApp</tt> so that the log
				output can be controlled at run-time. Here is a slightly modified
				version.
			</p>


<div>
<pre class="prettyprint linenums">
// file MyApp2.cpp

#include &quot;com/foo/bar.h&quot;
using namespace com::foo;

// include log4cxx header files.
#include &quot;log4cxx/logger.h&quot;
#include &quot;log4cxx/basicconfigurator.h&quot;
#include &quot;log4cxx/propertyconfigurator.h&quot;
#include &quot;log4cxx/helpers/exception.h&quot;

using namespace log4cxx;
using namespace log4cxx::helpers;
// Define a static logger variable so that it references the
// Logger instance named &quot;MyApp&quot;.
LoggerPtr logger(Logger::getLogger(&quot;MyApp&quot;));

int main(int argc, char **argv)
{
	int result = EXIT_SUCCESS;
	try
	{
		if (argc &gt; 1)
		{
			// BasicConfigurator replaced with PropertyConfigurator.
			PropertyConfigurator::configure(argv[1]);
		}
		else
		{
			BasicConfigurator::configure();
		}

		LOG4CXX_INFO(logger, &quot;Entering application.&quot;)
		Bar bar
		bar.doIt();
		LOG4CXX_INFO(logger, &quot;Exiting application.&quot;)
	}
	catch(Exception&amp;)
	{
		result = EXIT_FAILURE;
	}

	return result;
}</pre></div>


<p>
				This version of <tt>MyApp</tt> instructs
				<tt>PropertyConfigurator</tt> to parse a configuration file and
				set up logging accordingly.
			</p>


<p>
				Here is a sample configuration file that results in exactly same
				output as the previous <tt>BasicConfigurator</tt> based example.
			</p>


<div>
<pre class="prettyprint linenums">
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n</pre></div>


<p>
				It can be noticed that the PropertyConfigurator file format is the same as log4j.
			</p>


<p>
				Suppose we are no longer interested in seeing the output of any
				component belonging to the <tt>com::foo</tt> package. The following
				configuration file shows one possible way of achieving this.
			</p>


<div>
<pre class="prettyprint linenums">
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

# <b>Print the date in ISO 8601 format</b>
log4j.appender.A1.layout.ConversionPattern=<b>%d</b> [%t] %-5p %c - %m%n

# Print only messages of level WARN or above in the package com.foo.
<b>log4j.logger.com.foo=WARN</b></pre></div>


<p>
				The output of <tt>MyApp</tt> configured with this file is shown below.
			</p>


<div>
<pre class="prettyprint linenums">
<b>2000-09-07 14:07:41,508</b> [12345] INFO  MyApp - Entering application.
<b>2000-09-07 14:07:41,529</b> [12345] INFO  MyApp - Exiting application.</pre></div>


<p>
				As the logger <tt>com.foo.Bar</tt> does not have an assigned
				level, it inherits its level from <tt>com.foo</tt>, which
				was set to WARN in the configuration file. The log statement from the
				<tt>Bar::doIt</tt> method has the level DEBUG, lower than the
				logger level WARN. Consequently, <tt>doIt()</tt> method's log
				request is suppressed.
			</p>


<p>
				Here is another configuration file that uses multiple appenders.
			</p>


<div>
<pre class="prettyprint linenums">
log4j.rootLogger=debug, <b>stdout, R</b>

log4j.appender.<b>stdout</b>=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] <b>(%F:%L)</b> - %m%n

log4j.appender.<b>R</b>=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=<b>100KB</b>
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n</pre></div>


<p>
				Calling the enhanced MyApp with the this configuration file will
				output the following on the console.
			</p>


<div>
<pre class="prettyprint linenums">
INFO [12345] <b>(MyApp2.cpp:31)</b> - Entering application.
DEBUG [12345] (Bar.h:16) - Doing it again!
INFO [12345] (MyApp2.cpp:34) - Exiting application.</pre></div>


<p>
				In addition, as the root logger has been allocated a second
				appender, output will also be directed to the <tt>example.log</tt>
				file. This file will be rolled over when it reaches 100KB. When
				roll-over occurs, the old version of <tt>example.log</tt> is
				automatically moved to <tt>example.log.1</tt>.
			</p>


<p>
				Note that to obtain these different logging behaviors we did not
				need to recompile code. We could just as easily have logged to a UNIX
				Syslog daemon, redirected all <tt>com.foo</tt> output to an NT
				Event logger, or forwarded logging events to a remote log4cxx server,
				which would log according to local server policy, for example by
				forwarding the log event to a second log4cxx server.
			</p>
		</div>


<div class="section">
<h2>Default Initialization Procedure<a name="Default_Initialization_Procedure"></a></h2>

<p>
				The log4cxx library does not make any assumptions about its
				environment. In particular, there are no default log4cxx
				appenders. Under certain well-defined circumstances however, the
				static inializer of the <tt>Logger</tt> class will attempt to
				automatically configure log4cxx.
			</p>


<p>
				The exact default initialization algorithm is defined as follows:
			</p>


<ol style="list-style-type: decimal">

<li>

<p>
						Set the configurationOptionStr string variable to the value of the
						<b>LOG4CXX_CONFIGURATION</b> environment variable if set, otherwise
						the value of the <b>log4j.configuration</b> or <b>LOG4CXX_CONFIGURATION</b>
						environment variable if set,
						otherwise the first of the following file names which exist in the
						current working directory, &quot;log4cxx.xml&quot;, &quot;log4cxx.properties&quot;,
						&quot;log4j.xml&quot; and &quot;log4j.properties&quot;.
						If configurationOptionStr has not been set, then disable logging.
					</p>
				</li>

<li>

<p>
						Unless a custom configurator is specified using the
						<b>LOG4CXX_CONFIGURATOR_CLASS</b> or <b>log4j.configuratorClass</b>
						environment variable, the PropertyConfigurator will be used to configure
						log4cxx unless the file name ends with the &quot;.xml&quot; extension,
						in which case the DOMConfigurator will be used.
						If a custom configurator is specified, the environment variable
						should contain a fully qualified class name of a class that
						implements the Configurator interface.
					</p>
				</li>
			</ol>
		</div>


<div class="section">
<h2>Nested Diagnostic Contexts<a name="Nested_Diagnostic_Contexts"></a></h2>

<p>
				Most real-world systems have to deal with multiple clients
				simultaneously. In a typical multithreaded implementation of such a
				system, different threads will handle different clients. Logging is
				especially well suited to trace and debug complex distributed
				applications. A common approach to differentiate the logging output of
				one client from another is to instantiate a new separate logger for
				each client. This promotes the proliferation of loggers and
				increases the management overhead of logging.
			</p>


<p>
				A lighter technique is to uniquely stamp each log request initiated
				from the same client interaction. Neil Harrison described this method
				in the book &quot;Patterns for Logging Diagnostic Messages,&quot; in <i>Pattern
				Languages of Program Design 3</i>, edited by R. Martin, D.  Riehle,
				and F. Buschmann (Addison-Wesley, 1997).
			</p>


<p>
				To uniquely stamp each request, the
				user pushes contextual information into the NDC, the abbreviation of
				<i>Nested Diagnostic Context</i>. The NDC class is shown below.
			</p>


<div>
<pre class="prettyprint linenums">
namespace log4cxx {
	class NDC {
		public:
			// pushes the value on construction and pops on destruction.
			NDC(const std::string&amp; value);
			NDC(const std::wstring&amp; value);

			// Remove the top of the context from the NDC.
			<b>static</b> LogString pop();

			// Add diagnostic context for the current thread.
			<b>static</b> void push(const std::string&amp; message);
			<b>static</b> void push(const std::wstring&amp; message);
	}
}</pre></div>


<p>
				The NDC is managed per thread as a <i>stack</i> of contextual
				information. Note that all methods of the <tt>log4cxx::NDC</tt>
				class are static. Assuming that NDC printing is turned on, every time
				a log request is made, the appropriate log4cxx component will include
				the <i>entire</i> NDC stack for the current thread in the log
				output. This is done without the intervention of the user, who is
				responsible only for placing the correct information in the NDC by
				using the <tt>push</tt> and <tt>pop</tt> methods at a few
				well-defined points in the code.  In contrast, the per-client logger
				approach commands extensive changes in the code.
			</p>


<p>
				To illustrate this point, let us take the example of a servlet
				delivering content to numerous clients. The servlet can build the NDC
				at the very beginning of the request before executing other code. The
				contextual information can be the client's host name and other
				information inherent to the request, typically information contained
				in cookies. Hence, even if the servlet is serving multiple clients
				simultaneously, the logs initiated by the same code, i.e. belonging to
				the same logger, can still be distinguished because each client
				request will have a different NDC stack. Contrast this with the
				complexity of passing a freshly instantiated logger to all code
				exercised during the client's request.
			</p>


<p>
				Nevertheless, some sophisticated applications, such as virtual
				hosting web servers, must log differently depending on the virtual
				host context and also depending on the software component issuing the
				request. Recent log4cxx releases support multiple hierarchy trees. This
				enhancement allows each virtual host to possess its own copy of the
				logger hierarchy.
			</p>
		</div>


<div class="section">
<h2>Performance<a name="Performance"></a></h2>

<p>
				One of the often-cited arguments against logging is its
				computational cost. This is a legitimate concern as even moderately
				sized applications can generate thousands of log requests. Much
				effort was spent measuring and tweaking logging performance. Log4cxx
				claims to be fast and flexible: speed first, flexibility second.
			</p>


<p>
				The user should be aware of the following performance issues.
			</p>


<ol style="list-style-type: decimal">

<li>

<p>
						<b>Logging performance when logging is turned off.</b>
					</p>


<p>
						When logging is turned off entirely or just for a set
						of levels, the cost of a log request consists of a method
						invocation plus an integer comparison.  The LOG4CXX_DEBUG and similar
						macros suppress unnecessary expression evaluation if the
						request is not enabled.
					</p>
				</li>


<li>

<p>
						<b>The performance of deciding whether to log or not to log when logging is turned on.</b>
					</p>


<p>
						This is essentially the performance of walking the logger
						hierarchy. When logging is turned on, log4cxx still needs to compare
						the level of the log request with the level of the request
						logger. However, loggers may not have an assigned
						level; they can inherit them from the logger hierarchy. Thus,
						before inheriting a level, the logger may need to search its
						ancestors.
					</p>


<p>
						There has been a serious effort to make this hierarchy walk to
						be as fast as possible. For example, child loggers link only to
						their existing ancestors. In the <tt>BasicConfigurator</tt>
						example shown earlier, the logger named <tt>com.foo.Bar</tt> is
						linked directly to the root logger, thereby circumventing the
						nonexistent <tt>com</tt> or <tt>com.foo</tt> loggers. This
						significantly improves the speed of the walk, especially in &quot;sparse&quot;
						hierarchies.
					</p>


<p>
						The cost of walking the hierarchy is typically 3
						times slower than when logging is turned off entirely.
					</p>
				</li>

<li>

<p>
						<b>Actually outputting log messages</b>
					</p>


<p>
						This is the cost of formatting the log output and sending it to
						its target destination. Here again, a serious effort was made to
						make layouts (formatters) perform as quickly as possible. The same
						is true for appenders.
					</p>
				</li>
			</ol>
		</div>


<div class="section">
<h2>Conclusions<a name="Conclusions"></a></h2>

<p>
				Apache Log4cxx is a popular logging package written in C++.  One of its
				distinctive features is the notion of inheritance in loggers. Using
				a logger hierarchy it is possible to control which log statements
				are output at arbitrary granularity. This helps reduce the volume of
				logged output and minimize the cost of logging.
			</p>


<p>
				One of the advantages of the log4cxx API is its manageability. Once
				the log statements have been inserted into the code, they can be
				controlled with configuration files. They can be selectively enabled
				or disabled, and sent to different and multiple output targets in
				user-chosen formats. The log4cxx package is designed so that log
				statements can remain in shipped code without incurring a heavy
				performance cost.
			</p>
		</div>


					</td>
				</tr>
			</table>
		</div>

		<div class="footer">
							<p>Copyright © 2003-2019 <a class="external" href="http://www.apache.org">Apache Software Foundation</a>. All Rights Reserved.</p>
				<p>Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.</p>
				<p>Site powered by <a class="external" href="http://getbootstrap.com/">Twitter Bootstrap</a>. Icons from <a class="external" href="http://glyphicons.com/">Glyphicons Free</a>.</p>
		</div>
	</body>
</html>