<!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 - Frequently Asked Technical Questions - 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">
									<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 active">
									<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><a name="top">Frequently Asked Technical Questions</a><a name="Frequently_Asked_Technical_Questions"></a></h2>
<ol style="list-style-type: decimal">
<li><a href="#custom_levels">How do I add a custom level to Apache log4cxx?</a></li>
<li><a href="#msvc_crash">My application on Windows crashes on shutdown?</a></li>
<li><a href="#unicode">Does Apache log4cxx support Unicode?</a></li></ol></div>
<dl>
<dt><a name="custom_levels">How do I add a custom level to Apache log4cxx?</a></dt>
<dd>

<p>This is a common topic for all the Apache logging frameworks and
      typically motivated to try to categorize events by functionality or
      audience.  An common request is to add an AUDIT level so that the
      user can configure AUDIT level messages to go to a specific appender.
      However, the logger name was designed explicitly to support
      routing of messages by topic or audience.  The common
      pattern of using classnames for logger names obscures the more
      general capability of logger name to represent the topic or audience
      of the logging request.  The easiest approach to solve the underlying issue
      is to use a logger names like &quot;AUDIT.com.example.MyPackage.MyClass&quot;
      that allow all AUDIT messages to be routed to a particular appender.
      If you attempted to use a level for that then you would lose
      the ability to distinguish between different significances within
      the audit messages.
     </p>
<p align="right"><a href="#top">[top]</a></p><hr /></dd>
<dt><a name="msvc_crash">My application on Windows crashes on shutdown?</a></dt>
<dd>

<p>Apache log4cxx API calls use C++ Standard Template Library string
      parameters.  If the caller is using a different instance or type of the
      C Runtime Library that log4cxx, then it is very likely that some memory
      that was originally allocated by log4cxx would be freed by the caller.
      If log4cxx and the caller are using different C RTL's, the program
      will likely crash at the point.  Use &quot;Multithread DLL&quot; with release
      builds of log4cxx and &quot;Multithread DLL Debug&quot; with debug builds.
     </p>
<p align="right"><a href="#top">[top]</a></p><hr /></dd>
<dt><a name="unicode">Does Apache log4cxx support Unicode?</a></dt>
<dd>

<p>Yes.  Apache log4cxx exposes API methods in multiple string flavors
      const char*, std::string, wchar_t*, std::wstring, CFStringRef et al.
      const char* and std::string are interpreted according to the
      current locale settings.  Applications should call setlocale(LC_ALL, &quot;&quot;)
      on startup or the C RTL will assume US-ASCII.
      Before being processed internally, all these are converted to the
      LogString type which is one of several supported Unicode representations
      selected by the --with-logchar option.  When using methods that take LogString arguments,
      the LOG4CXX_STR() macro can be used to convert ASCII literals to
      the current LogString type.  FileAppenders support an encoding
      property which should be explicitly specified to &quot;UTF-8&quot; or &quot;UTF-16&quot;
      for XML files.
     </p>
<p align="right"><a href="#top">[top]</a></p></dd></dl>
					</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>