blob: 7eb96a4137b82fbfe77dd5a07ab2f29baad67cea [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia Site Renderer 1.9.1 from src/site/xdoc/manual/webapp.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="Nick Williams" />
<meta name="author" content="Matt Sicker" />
<title>Log4j &#x2013; Log4j 2 Web Applications</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-right"></span>Java API</a></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 class="active"><a href="#"><span class="icon-chevron-down"></span>Web Applications and JSPs</a>
<ul class="nav nav-list">
<li><a href="../manual/webapp.html#Servlet-3.0" title="Servlet 3.0 and Newer"><span class="none"></span>Servlet 3.0 and Newer</a></li>
<li><a href="../manual/webapp.html#Servlet-2.5" title="Servlet 2.5"><span class="none"></span>Servlet 2.5</a></li>
<li><a href="../manual/webapp.html#ContextParams" title="Context Parameters"><span class="none"></span>Context Parameters</a></li>
<li><a href="../manual/webapp.html#WebLookup" title="Configuration Lookups"><span class="none"></span>Configuration Lookups</a></li>
<li><a href="../manual/webapp.html#JspLogging" title="JavaServer Pages Logging"><span class="none"></span>JavaServer Pages Logging</a></li>
<li><a href="../manual/webapp.html#Async" title="Asynchronous Requests"><span class="none"></span>Asynchronous Requests</a></li>
</ul></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="Using_Log4j_2_in_Web_Applications"></a>Using Log4j 2 in Web Applications</h2>
<p>
You must take particular care when using Log4j or any other logging framework within a Java EE web application.
It's important for logging resources to be properly cleaned up (database connections closed, files closed, etc.)
when the container shuts down or the web application is undeployed. Because of the nature of class loaders
within web applications, Log4j resources cannot be cleaned up through normal means. Log4j must be &quot;started&quot; when
the web application deploys and &quot;shut down&quot; when the web application undeploys. How this works varies depending
on whether your application is a <a href="#Servlet-3.0">Servlet 3.0 or newer</a> or
<a href="#Servlet-2.5">Servlet 2.5</a> web application.
</p>
<p>
In either case, you'll need to add the log4j-web module to your deployment as detailed in the
<a href="../maven-artifacts.html">Maven, Ivy, and Gradle Artifacts</a> manual page.
</p>
<p class="big-red">
<i></i>
To avoid problems the Log4j shutdown hook will automatically be disabled when the log4j-web jar is included.
</p>
<a name="Configuration"></a>
<section>
<h3><a name="Configuration"></a>Configuration</h3>
<p>
Log4j allows the configuration file to be specified in web.xml using the log4jConfiguration
context parameter. Log4j will search for configuration files by:
</p>
<ol style="list-style-type: decimal">
<li>
If a location is provided it will be searched for as a servlet context resource. For example, if
log4jConfiguration contains &quot;logging.xml&quot; then Log4j will look for a file with that
name in the root directory of the web application.
</li>
<li>
If no location is defined Log4j will search for a file that starts with &quot;log4j2&quot; in the WEB-INF directory.
If more than one file is found, and if a file that starts with &quot;log4j2-<var>name</var>&quot; is present, where
<var>name</var> is the name of the web application, then it will be used. Otherwise the first file will be
used.
</li>
<li>
The &quot;normal&quot; search sequence using the classpath and file URLs will be used to locate the configuration file.
</li>
</ol>
</section>
<section>
<h3><a name="Servlet_3.0_and_Newer_Web_Applications"></a>Servlet 3.0 and Newer Web Applications</h3>
<a name="Servlet-3.0"></a>
<p>
A Servlet 3.0 or newer web application is any &lt;web-app&gt; whose version
attribute has a value of &quot;3.0&quot; or higher. Of course, the application must also be running in a compatible
web container. Some examples are: Tomcat 7.0 and higher, GlassFish 3.0 and higher, JBoss 7.0 and higher,
Oracle WebLogic 12c and higher, and IBM WebSphere 8.0 and higher.
</p>
<section>
<h4><a name="The_Short_Story"></a>The Short Story</h4>
<p>
Log4j 2 &quot;just works&quot; in Servlet 3.0 and newer web applications. It is capable of automatically starting when
the application deploys and shutting down when the application undeploys. Thanks to the
<a class="javadoc" href="http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html">ServletContainerInitializer</a>
API added to Servlet 3.0, the relevant Filter and ServletContextListener classes
can be registered dynamically on web application startup.
</p>
<p>
<b><i></i> Important Note!</b>
For performance reasons, containers often ignore certain JARs known not to
contain TLDs or ServletContainerInitializers and do not scan them for web-fragments and
initializers. Importantly, Tomcat 7 &lt;7.0.43 ignores all JAR files named log4j*.jar, which prevents this
feature from working. This has been fixed in Tomcat 7.0.43, Tomcat 8, and later. In Tomcat 7 &lt;7.0.43 you
will need to change catalina.properties and remove &quot;log4j*.jar&quot; from the jarsToSkip
property. You may need to do something similar on other containers if they skip scanning Log4j JAR files.
</p>
</section><section>
<h4><a name="The_Long_Story"></a>The Long Story</h4>
<p>
The Log4j 2 Web JAR file is a web-fragment configured to order before any other web fragments in your
application. It contains a ServletContainerInitializer
(<a href="../log4j-web/apidocs/org/apache/logging/log4j/web/Log4jServletContainerInitializer.html" class="javadoc">Log4jServletContainerInitializer</a>) that the container automatically discovers and initializes. This adds
the <a href="../log4j-core/apidocs/org/apache/logging/log4j/web/Log4jServletContextListener.html" class="javadoc">Log4jServletContextListener</a> and
<a href="../log4j-web/apidocs/org/apache/logging/log4j/web/Log4jServletFilter.html" class="javadoc">Log4jServletFilter</a> to the ServletContext. These classes properly initialize
and deinitialize the Log4j configuration.
</p>
<p>
For some users, automatically starting Log4j is problematic or undesirable. You can easily disable this
feature using the isLog4jAutoInitializationDisabled context parameter. Simply add it to your
deployment descriptor with the value &quot;true&quot; to disable auto-initialization. You <i>must</i> define the
context parameter in web.xml. If you set in programmatically, it will be too late for Log4j
to detect the setting.
</p>
<div>
<pre class="prettyprint linenums"> &lt;context-param&gt;
&lt;param-name&gt;isLog4jAutoInitializationDisabled&lt;/param-name&gt;
&lt;param-value&gt;true&lt;/param-value&gt;
&lt;/context-param&gt;</pre></div>
<p>
Once you disable auto-initialization, you must initialize Log4j as you would a
<a href="#Servlet-2.5">Servlet 2.5 web application</a>. You must do so in a way that this initialization
happens before any other application code (such as Spring Framework startup code) executes.
</p>
<p>
You can customize the behavior of the listener and filter using the log4jContextName,
log4jConfiguration, and/or isLog4jContextSelectorNamed context parameters. Read more
about this in the <a href="#ContextParams">Context Parameters</a> section below. You <i>must not</i>
manually configure the Log4jServletContextListener or Log4jServletFilter in your
deployment descriptor (web.xml) or in another initializer or listener in a Servlet 3.0 or newer
application <i>unless you disable auto-initialization</i> with
isLog4jAutoInitializationDisabled. Doing so will result in startup errors and unspecified
erroneous behavior.
</p>
</section></section>
<section>
<h3><a name="Servlet_2.5_Web_Applications"></a>Servlet 2.5 Web Applications</h3>
<a name="Servlet-2.5"></a>
<p>
A Servlet 2.5 web application is any &lt;web-app&gt; whose version attribute has a
value of &quot;2.5.&quot; The version attribute is the only thing that matters; even if the web application
is running in a Servlet 3.0 or newer container, it is a Servlet 2.5 web application if the
version attribute is &quot;2.5.&quot; Note that Log4j 2 does not support Servlet 2.4 and older web
applications.
</p>
<p>
If you are using Log4j in a Servlet 2.5 web application, or if you have disabled auto-initialization with
the isLog4jAutoInitializationDisabled context parameter, you <i>must</i> configure the
<a href="../log4j-web/apidocs/org/apache/logging/log4j/web/Log4jServletContextListener.html" class="javadoc">Log4jServletContextListener</a> and
<a href="../log4j-web/apidocs/org/apache/logging/log4j/web/Log4jServletFilter.html" class="javadoc">Log4jServletFilter</a> in the deployment descriptor or programmatically. The filter should match all
requests of any type. The listener should be the very first listener defined in your application, and the
filter should be the very first filter defined and mapped in your application. This is easily accomplished
using the following web.xml code:
</p>
<div>
<pre class="prettyprint linenums"> &lt;listener&gt;
&lt;listener-class&gt;org.apache.logging.log4j.web.Log4jServletContextListener&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;filter&gt;
&lt;filter-name&gt;log4jServletFilter&lt;/filter-name&gt;
&lt;filter-class&gt;org.apache.logging.log4j.web.Log4jServletFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;log4jServletFilter&lt;/filter-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
&lt;dispatcher&gt;ERROR&lt;/dispatcher&gt;
&lt;dispatcher&gt;ASYNC&lt;/dispatcher&gt;&lt;!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 --&gt;
&lt;/filter-mapping&gt;</pre></div>
<p>
You can customize the behavior of the listener and filter using the log4jContextName,
log4jConfiguration, and/or isLog4jContextSelectorNamed context parameters. Read more
about this in the <a href="#ContextParams">Context Parameters</a> section below.
</p>
</section>
<section>
<h3><a name="Context_Parameters"></a>Context Parameters</h3>
<a name="ContextParams"></a>
<p>
By default, Log4j 2 uses the ServletContext's
<a class="externalLink" href="http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#getServletContextName()">context name</a>
as the LoggerContext name and uses the standard pattern for locating the Log4j configuration
file. There are three context parameters that you can use to control this behavior. The first,
isLog4jContextSelectorNamed, specifies whether the context should be selected using the
<a href="../log4j-core/apidocs/org/apache/logging/log4j/core/selector/JndiContextSelector.html" class="javadoc">JndiContextSelector</a>. If isLog4jContextSelectorNamed is not specified or is anything other
than true, it is assumed to be false.
</p>
<p>
If isLog4jContextSelectorNamed is true, log4jContextName must be
specified or display-name must be specified in web.xml; otherwise, the application
will fail to start with an exception. log4jConfiguration
<i>should</i> also be specified in this case, and must be a valid URI for the configuration file; however,
this parameter is not required.
</p>
<p>
If isLog4jContextSelectorNamed is not true, log4jConfiguration may
optionally be specified and must be a valid URI or path to a configuration file or start with &quot;classpath:&quot; to
denote a configuration file that can be found on the classpath. Without this parameter, Log4j will use the
standard mechanisms for locating the configuration file.
</p>
<p>
When specifying these context parameters, you must specify them in the deployment descriptor
(web.xml) even in a Servlet 3.0 or never application. If you add them to the
ServletContext within a listener, Log4j will initialize before the context parameters are
available and they will have no effect. Here are some sample uses of these context parameters.
</p>
<section>
<h4><a name="Set_the_Logging_Context_Name_to_.22myApplication.22"></a>Set the Logging Context Name to &quot;myApplication&quot;</h4>
<div>
<pre class="prettyprint linenums"> &lt;context-param&gt;
&lt;param-name&gt;log4jContextName&lt;/param-name&gt;
&lt;param-value&gt;myApplication&lt;/param-value&gt;
&lt;/context-param&gt;</pre></div>
</section><section>
<h4><a name="Set_the_Configuration_Path.2FFile.2FURI_to_.22.2Fetc.2FmyApp.2FmyLogging.xml.22"></a>Set the Configuration Path/File/URI to &quot;/etc/myApp/myLogging.xml&quot;</h4>
<div>
<pre class="prettyprint linenums"> &lt;context-param&gt;
&lt;param-name&gt;log4jConfiguration&lt;/param-name&gt;
&lt;param-value&gt;file:///etc/myApp/myLogging.xml&lt;/param-value&gt;
&lt;/context-param&gt;</pre></div>
</section><section>
<h4><a name="Use_the_JndiContextSelector"></a>Use the JndiContextSelector</h4>
<div>
<pre class="prettyprint linenums"> &lt;context-param&gt;
&lt;param-name&gt;isLog4jContextSelectorNamed&lt;/param-name&gt;
&lt;param-value&gt;true&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;context-param&gt;
&lt;param-name&gt;log4jContextName&lt;/param-name&gt;
&lt;param-value&gt;appWithJndiSelector&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;context-param&gt;
&lt;param-name&gt;log4jConfiguration&lt;/param-name&gt;
&lt;param-value&gt;file:///D:/conf/myLogging.xml&lt;/param-value&gt;
&lt;/context-param&gt;</pre></div>
<p>
Note that in this case you must also set the &quot;Log4jContextSelector&quot; system property to
&quot;<kbd>org.apache.logging.log4j.core.selector.JndiContextSelector</kbd>&quot;.
</p>
</section></section>
<section>
<h3><a name="Using_Web_Application_Information_During_the_Configuration"></a>Using Web Application Information During the Configuration</h3>
<a name="WebLookup"></a>
<p>
You may want to use information about the web application during configuration. For example, you could embed
the web application's context path in the name of a Rolling File Appender. See WebLookup in
<a href="./lookups.html#WebLookup">Lookups</a> for more information.
</p>
</section>
<section>
<h3><a name="JavaServer_Pages_Logging"></a>JavaServer Pages Logging</h3>
<a name="JspLogging"></a>
<p>
You may use Log4j 2 within JSPs just as you would within any other Java code. Simple obtain a
Logger and call its methods to log events. However, this requires you to use Java code within
your JSPs, and some development teams rightly are not comfortable with doing this. If you have a dedicated
user interface development team that is not familiar with using Java, you may even have Java code disabled in
your JSPs.
</p>
<p>
For this reason, Log4j 2 provides a JSP Tag Library that enables you to log events without using any Java
code. To read more about using this tag library, <a href="../log4j-taglib/index.html">read the Log4j Tag
Library documentation.</a>
</p>
<p>
<b><i></i> Important Note!</b>
As noted above, containers often ignore certain JARs known not to
contain TLDs and do not scan them for TLD files. Importantly, Tomcat 7 &lt;7.0.43 ignores all JAR files named
log4j*.jar, which prevents the JSP tag library from being automatically discovered. This does not affect
Tomcat 6.x and has been fixed in Tomcat 7.0.43, Tomcat 8, and later. In Tomcat 7 &lt;7.0.43 you
will need to change catalina.properties and remove &quot;log4j*.jar&quot; from the jarsToSkip
property. You may need to do something similar on other containers if they skip scanning Log4j JAR files.
</p>
</section>
<section>
<h3><a name="Asynchronous_Requests_and_Threads"></a>Asynchronous Requests and Threads</h3>
<a name="Async"></a>
<p>
The handling of asynchronous requests is tricky, and regardless of Servlet container version or configuration
Log4j cannot handle everything automatically. When standard requests, forwards, includes, and error resources
are processed, the Log4jServletFilter binds the LoggerContext to the thread handling
the request. After request processing completes, the filter unbinds the LoggerContext from the
thread.
</p>
<p>
Similarly, when an internal request is dispatched using a javax.servlet.AsyncContext, the
Log4jServletFilter also binds the LoggerContext to the thread handling the request
and unbinds it when request processing completes. However, this only happens for requests <i>dispatched</i>
through the AsyncContext. There are other asynchronous activities that can take place other than
internal dispatched requests.
</p>
<p>
For example, after starting an AsyncContext you could start up a separate thread to process the
request in the background, possibly writing the response with the ServletOutputStream. Filters
cannot intercept the execution of this thread. Filters also cannot intercept threads that you start in
the background during non-asynchronous requests. This is true whether you use a brand new thread or a thread
borrowed from a thread pool. So what can you do for these special threads?
</p>
<p>
You may not need to do anything. If you didn't use the isLog4jContextSelectorNamed context
parameter, there is no need to bind the LoggerContext to the thread. Log4j can safely locate the
LoggerContext on its own. In these cases, the filter provides only very modest performance
gains, and only when creating new Loggers. However, if you <i>did</i> specify the
isLog4jContextSelectorNamed context parameter with the value &quot;true&quot;, you will need to manually
bind the LoggerContext to asynchronous threads. Otherwise, Log4j will not be able to locate it.
</p>
<p>
Thankfully, Log4j provides a simple mechanism for binding the LoggerContext to asynchronous
threads in these special circumstances. The simplest way to do this is to wrap the Runnable
instance that is passed to the AsyncContext.start() method.
</p>
<div>
<pre class="prettyprint linenums">
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.web.WebLoggerContextUtils;
public class TestAsyncServlet extends HttpServlet {
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
final AsyncContext asyncContext = req.startAsync();
asyncContext.start(WebLoggerContextUtils.wrapExecutionContext(this.getServletContext(), new Runnable() {
@Override
public void run() {
final Logger logger = LogManager.getLogger(TestAsyncServlet.class);
logger.info(&quot;Hello, servlet!&quot;);
}
}));
}
@Override
protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
final AsyncContext asyncContext = req.startAsync();
asyncContext.start(new Runnable() {
@Override
public void run() {
final Log4jWebSupport webSupport =
WebLoggerContextUtils.getWebLifeCycle(TestAsyncServlet.this.getServletContext());
webSupport.setLoggerContext();
// do stuff
webSupport.clearLoggerContext();
}
});
}
}
</pre></div>
<p>
This can be slightly more convenient when using Java 1.8 and lambda functions as demonstrated below.
</p>
<div>
<pre class="prettyprint linenums">
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.web.WebLoggerContextUtils;
public class TestAsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final AsyncContext asyncContext = req.startAsync();
asyncContext.start(WebLoggerContextUtils.wrapExecutionContext(this.getServletContext(), () -&gt; {
final Logger logger = LogManager.getLogger(TestAsyncServlet.class);
logger.info(&quot;Hello, servlet!&quot;);
}));
}
}
</pre></div>
<p>
Alternatively, you can obtain the
<a href="../log4j-web/apidocs/org/apache/logging/log4j/web/Log4jWebLifeCycle.html" class="javadoc">Log4jWebLifeCycle</a>
instance from the ServletContext attributes, call its setLoggerContext method as
the very first line of code in your asynchronous thread, and call its clearLoggerContext method
as the very last line of code in your asynchronous thread. The following code demonstrates this. It uses the
container thread pool to execute asynchronous request processing, passing an anonymous inner
Runnable to the start method.
</p>
<div>
<pre class="prettyprint linenums">
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.web.Log4jWebLifeCycle;
import org.apache.logging.log4j.web.WebLoggerContextUtils;
public class TestAsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final AsyncContext asyncContext = req.startAsync();
asyncContext.start(new Runnable() {
@Override
public void run() {
final Log4jWebLifeCycle webLifeCycle =
WebLoggerContextUtils.getWebLifeCycle(TestAsyncServlet.this.getServletContext());
webLifeCycle.setLoggerContext();
try {
final Logger logger = LogManager.getLogger(TestAsyncServlet.class);
logger.info(&quot;Hello, servlet!&quot;);
} finally {
webLifeCycle.clearLoggerContext();
}
}
});
}
}
</pre></div>
<p>
Note that you <i>must</i> call clearLoggerContext once your thread is finished
processing. Failing to do so will result in memory leaks. If using a thread pool, it can even disrupt the
logging of other web applications in your container. For that reason, the example here shows clearing the
context in a finally block, which will always execute.
</p>
</section>
<section>
<h3><a name="Using_the_Servlet_Appender"></a>Using the Servlet Appender</h3>
<p>
Log4j provides a Servlet Appender that uses the servlet context as the log target. For example:
</p>
<div>
<pre class="prettyprint linenums">
&lt;Configuration status=&quot;WARN&quot; name=&quot;ServletTest&quot;&gt;
&lt;Appenders&gt;
&lt;Servlet name=&quot;Servlet&quot;&gt;
&lt;PatternLayout pattern=&quot;%m%n%ex{none}&quot;/&gt;
&lt;/Servlet&gt;
&lt;/Appenders&gt;
&lt;Loggers&gt;
&lt;Root level=&quot;debug&quot;&gt;
&lt;AppenderRef ref=&quot;Servlet&quot;/&gt;
&lt;/Root&gt;
&lt;/Loggers&gt;
&lt;/Configuration&gt;</pre></div>
<p>
To avoid double logging of exceptions to the servlet context, you must use %ex{none} in your
PatternLayout as shown in the example. The exception will be omitted from the message text but
it is passed to the servlet context as the actual Throwable object.
</p>
</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>