<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<document url="logging.html">

    &project;

  <properties>
    <title>Logging in Tomcat</title>
    <author>Allistair Crossley</author>
    <author email="yoavs@apache.org">Yoav Shapira</author>
  </properties>

<body>

<section name="Table of Contents">
<toc/>
</section>

  <section name="Introduction">
    <p>
      The internal logging for Apache Tomcat uses JULI, a packaged renamed fork
      of <a href="http://commons.apache.org/logging">Apache Commons Logging</a>
      that, by default, is hard-coded to use the <code>java.util.logging</code>
      framework. This ensures that Tomcat&apos;s internal logging and any web
      application logging will remain independent, even if a web application
      uses Apache Commons Logging.
    </p>

    <p>
      To configure Tomcat to use an alternative logging framework for its
      internal logging, one has to replace the JULI impementation that is
      hard-coded to use <code>java.util.logging</code> with a JULI
      implementation that retains the full Commons Logging discovery mechanism.
      Such an implementation is provided as an <a href="extras.html">extras</a>
      component. Instructions on how to configure Tomcat to use Log4j framework
      for its internal logging may be found <a href="#Using_Log4j">below</a>.
    </p>

    <p>
      A web application running on Apache Tomcat can:
    </p>
    <ul>
      <li>
        Use any logging framework of its choice.
      </li>
      <li>
        Use system logging API, <code>java.util.logging</code>.
      </li>
      <li>
        Use the logging API provided by the Java Servlets specification,
        <code>javax.servlet.ServletContext.log(...)</code>
      </li>
    </ul>

    <p>
      The logging frameworks used by different web applications are independent.
      See <a href="class-loader-howto.html">class loading</a> for more details.
      The exception to this rule is <code>java.util.logging</code>. If it used
      directly or indirectly by your logging library then elements of it will be
      shared across web applications because it is loaded by the system class
      loader.
    </p>

    <subsection name="Java logging API &#8212; java.util.logging">

    <p>
      Apache Tomcat has its own implementation of several key elements of
      <code>java.util.logging</code> API. This implementation is called JULI.
      The key component there is a custom LogManager implementation,
      that is aware of different web applications running on Tomcat (and
      their different class loaders). It supports private per-application
      logging configurations. It is also notified by Tomcat when a web application
      is unloaded from memory, so that the references to its classes can be
      cleared, preventing memory leaks.
    </p>

    <p>
      This <code>java.util.logging</code> implementation is enabled by providing
      certain system properties when starting Java. The Apache Tomcat startup
      scripts do this for you, but if you are using different tools to run
      Tomcat (such as jsvc, or running Tomcat from within an IDE), you should
      take care of them by yourself.
    </p>

    <p>
      More details about java.util.logging may be found in the documentation
      for your JDK and on its Javadoc pages for the <code>java.util.logging</code>
      package.
    </p>

    <p>
      More details about Tomcat JULI may be found below.
    </p>

    </subsection>

    <subsection name="Servlets logging API">

    <p>
      The calls to <code>javax.servlet.ServletContext.log(...)</code> to write
      log messages are handled by internal Tomcat logging. Such messages are
      logged to the category named
    </p>
      <source>org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}]</source>
    <p>
      This logging is performed according to the Tomcat logging configuration. You
      cannot overwrite it in a web application.
    </p>

    <p>
      The Servlets logging API predates the <code>java.util.logging</code> API
      that is now provided by Java. As such, it does not offer you much options.
      E.g., you cannot control the log levels. It can be noted, though, that
      in Apache Tomcat implementation the calls to <code>ServletContext.log(String)</code>
      or <code>GenericServlet.log(String)</code> are logged at the INFO level.
      The calls to <code>ServletContext.log(String, Throwable)</code> or
      <code>GenericServlet.log(String, Throwable)</code>
      are logged at the ERROR level.
    </p>

    </subsection>

    <subsection name="Console">

    <p>
      When running Tomcat on unixes, the console output is usually redirected
      to the file named <code>catalina.out</code>. The name is configurable
      using an environment variable. (See the startup scripts).
      Whatever is written to <code>System.err/out</code> will be caught into
      that file. That may include:
    </p>

    <ul>
      <li>Uncaught exceptions printed by <code>java.lang.ThreadGroup.uncaughtException(..)</code></li>
      <li>Thread dumps, if you requested them via a system signal</li>
    </ul>

    <p>
      When running as a service on Windows, the console output is also caught
      and redirected, but the file names are different.
    </p>

    <p>
      The default logging configuration in Apache Tomcat writes the same
      messages to the console and to a log file. This is great when using
      Tomcat for development, but usually is not needed in production.
    </p>

    <p>
      Old applications that still use <code>System.out</code> or <code>System.err</code>
      can be tricked by setting <code>swallowOutput</code> attribute on a
      <a href="config/context.html">Context</a>. If the attribute is set to
      <code>true</code>, the calls to <code>System.out/err</code> during request
      processing will be intercepted, and their output will be fed to the
      logging subsystem using the
      <code>javax.servlet.ServletContext.log(...)</code> calls.<br />
      <strong>Note</strong>, that the <code>swallowOutput</code>  feature is
      actually a trick, and it has its limitations.
      It works only with direct calls to <code>System.out/err</code>,
      and only during request processing cycle. It may not work in other
      threads that might be created by the application. It cannot be used to
      intercept logging frameworks that themselves write to the system streams,
      as those start early and may obtain a direct reference to the streams
      before the redirection takes place.
    </p>

    </subsection>

    <subsection name="Access logging">

    <p>
      Access logging is a related but different feature, which is
      implemented as a <code>Valve</code>. It uses self-contained
      logic to write its log files. The essential requirement for
      access logging is to handle a large continuous stream of data
      with low overhead, so it only uses Apache Commons Logging for
      its own debug messages. This implementation approach avoids
      additional overhead and potentially complex configuration.
      Please refer to the <a href="config/valve.html#Access_Logging">Valves</a>
      documentation for more details on its configuration, including
      the various report formats.
    </p>

    </subsection>

  </section>

  <section name="Using java.util.logging (default)">

  <p>
    The default implementation of java.util.logging provided in the JDK is too
    limited to be useful. The key limitation is the inability to have per-web
    application logging, as the configuration is per-VM. As a result, Tomcat
    will, in the default configuration, replace the default LogManager
    implementation with a container friendly implementation called JULI, which
    addresses these shortcomings.
  </p>
  <p>
    JULI supports the same configuration mechanisms as the standard JDK
    <code>java.util.logging</code>, using either a programmatic approach, or
    properties files. The main difference is that per-classloader properties
    files can be set (which enables easy redeployment friendly webapp
    configuration), and the properties files support extended constructs which
    allows more freedom for defining handlers and assigning them to loggers.
  </p>
  <p>
    JULI is enabled by default, and supports per classloader configuration, in
    addition to the regular global java.util.logging configuration. This means
    that logging can be configured at the following layers:
  </p>
    <ul>
      <li>Globally. That is usually done in the
        <code>${catalina.base}/conf/logging.properties</code> file.
        The file is specified by the <code>java.util.logging.config.file</code>
        System property which is set by the startup scripts.
        If it is not readable or is not configured, the default is to use the
        <code>${java.home}/lib/logging.properties</code> file in the JRE.
      </li>
      <li>In the web application. The file will be
        <code>WEB-INF/classes/logging.properties</code>
      </li>
    </ul>
  <p>
    The default <code>logging.properties</code> in the JRE specifies a
    <code>ConsoleHandler</code> that routes logging to System.err.
    The default <code>conf/logging.properties</code> in Apache Tomcat also
    adds several <code>FileHandler</code>s that write to files.
  </p>
  <p>
    A handler's log level threshold is INFO by default and can be set using
    SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST or ALL.
    You can also target specific packages to collect logging from and specify
    a level.
  </p>
  <p>
    To enable debug logging for part of Tomcat&apos;s internals, you should
    configure both the appropriate logger(s) and the appropriate handler(s) to
    use the <code>FINEST</code> or <code>ALL</code> level. e.g.:
  </p>
  <source>org.apache.catalina.session.level=ALL
java.util.logging.ConsoleHandler.level=ALL</source>
  <p>
    When enabling debug logging it is recommended that it is enabled for the
    narrowest possible scope as debug logging can generate large amounts of
    information.
  </p>
  <p>
    The configuration used by JULI is the same as the one supported by plain
    <code>java.util.logging</code>, but uses a few extensions to allow better
    flexibility in configuring loggers and handlers. The main differences are:
  </p>
  <ul>
      <li>A prefix may be added to handler names, so that multiple handlers of a
      single class may be instantiated. A prefix is a String which starts with a
      digit, and ends with '.'. For example, <code>22foobar.</code> is a valid
      prefix.</li>
      <li>System property replacement is performed for property values which
      contain ${systemPropertyName}.</li>
      <li>If using a class loader that implements the
      <code>org.apache.juli.WebappProperties</code> interface (Tomcat&apos;s
      web application class loader does) then property replacement is also
      performed for <code>${classloader.webappName}</code>,
      <code>${classloader.hostName}</code> and
      <code>${classloader.serviceName}</code> which are replaced with the
      web application name, the host name and the service name respectively.
      </li>
      <li>By default, loggers will not delegate to their parent if they have
      associated handlers. This may be changed per logger using the
      <code>loggerName.useParentHandlers</code> property, which accepts a
      boolean value.</li>
      <li>The root logger can define its set of handlers using the
      <code>.handlers</code> property.</li>
  </ul>
  <p>
    There are several additional implementation classes, that can be used
    together with the ones provided by Java. The notable one is
    <code>org.apache.juli.FileHandler</code>.
  </p>
  <p>
    <code>org.apache.juli.FileHandler</code> supports buffering of the
      logs. The buffering is not enabled by default. To configure it, use the
      <code>bufferSize</code> property of a handler. The value of <code>0</code>
      uses system default buffering (typically an 8K buffer will be used). A
      value of <code>&lt;0</code> forces a writer flush upon each log write. A
      value <code>&gt;0</code> uses a BufferedOutputStream with the defined
      value but note that the system default buffering will also be
      applied.
  </p>
  <p>
    Example logging.properties file to be placed in $CATALINA_BASE/conf:
  </p>
  <source><![CDATA[handlers = 1catalina.org.apache.juli.FileHandler, \
           2localhost.org.apache.juli.FileHandler, \
           3manager.org.apache.juli.FileHandler, \
           java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
   2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
   3manager.org.apache.juli.FileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE]]></source>

    <p>
      Example logging.properties for the servlet-examples web application to be
      placed in WEB-INF/classes inside the web application:
    </p>
    <source><![CDATA[handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = ${classloader.webappName}.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter]]></source>


    <subsection name="Documentation references">
      <p>See the following resources for additional information:</p>
      <ul>
        <li>Apache Tomcat Javadoc for the
          <a href="api/org/apache/juli/package-summary.html"><code>org.apache.juli</code></a>
          package.
        </li>
        <li>Oracle Java 6 Javadoc for the
          <a href="http://docs.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html"><code>java.util.logging</code></a>
          package.
        </li>
      </ul>
    </subsection>

    <subsection name="Considerations for production usage">
      <p>You may want to take note of the following:</p>
      <ul>
        <li>Consider removing <code>ConsoleHandler</code> from configuration. By
        default (thanks to the <code>.handlers</code> setting) logging goes both
        to a <code>FileHandler</code> and to a <code>ConsoleHandler</code>. The
        output of the latter one is usually captured into a file, such as
        <code>catalina.out</code>. Thus you end up with two copies of the same
        messages.</li>
        <li>Consider removing <code>FileHandler</code>s for the applications
        that you do not use. E.g., the one for <code>host-manager</code>.</li>
        <li>The handlers by default use the system default encoding to write
        the log files. It can be configured with <code>encoding</code> property.
        See Javadoc for details.</li>
        <li>Consider configuring an
        <a href="config/valve.html#Access_Logging">Access log</a>.</li>
      </ul>
    </subsection>

  </section>

  <section name="Using Log4j">
    <p>
      This section explains how to configure Tomcat to use
      <a href="http://logging.apache.org/log4j/">log4j</a> rather than
      java.util.logging for all Tomcat's internal logging.
    </p>
    <p><em>Note</em>: The steps described in this section are needed
      when you want to reconfigure Tomcat to use Apache log4j for its own
      logging. These steps are <strong>not</strong> needed if you just want
      to use log4j in your own web application. &#8212; In that case, just
      put <code>log4j.jar</code> and <code>log4j.properties</code> into
      <code>WEB-INF/lib</code> and <code>WEB-INF/classes</code>
      of your web application.
    </p>
    <p>
      The following steps describe configuring log4j to output Tomcat's
      internal logging.
    </p>

    <ol>
        <li>Create a file called <code>log4j.properties</code> with the
        following content and save it into <code>$CATALINA_BASE/lib</code></li>
    </ol>
    <source><![CDATA[
log4j.rootLogger = INFO, CATALINA

# Define all the appenders
log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
log4j.appender.CATALINA.Append = true
log4j.appender.CATALINA.Encoding = UTF-8
# Roll-over the log once per day
log4j.appender.CATALINA.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.LOCALHOST = org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File = ${catalina.base}/logs/localhost
log4j.appender.LOCALHOST.Append = true
log4j.appender.LOCALHOST.Encoding = UTF-8
log4j.appender.LOCALHOST.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File = ${catalina.base}/logs/manager
log4j.appender.MANAGER.Append = true
log4j.appender.MANAGER.Encoding = UTF-8
log4j.appender.MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.HOST-MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST-MANAGER.File = ${catalina.base}/logs/host-manager
log4j.appender.HOST-MANAGER.Append = true
log4j.appender.HOST-MANAGER.Encoding = UTF-8
log4j.appender.HOST-MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding = UTF-8
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost] = INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] =\
  INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager] =\
  INFO, HOST-MANAGER]]></source>
    <ol start="2">
        <li><a href="http://logging.apache.org/log4j">Download Log4J</a>
        (Tomcat requires v1.2.x).</li>

        <li><p>Download or build <code>tomcat-juli.jar</code> and
        <code>tomcat-juli-adapters.jar</code> that are available as an "extras"
        component for Tomcat. See <a href="extras.html">Additional Components
        documentation</a> for details.</p>
        <p>This <code>tomcat-juli.jar</code> differs from the default one. It
        contains the full Apache Commons Logging implementation and thus is
        able to discover the presense of log4j and configure itself.</p>
        </li>

        <li><p>If you want to configure Tomcat to use log4j globally:</p>
        <ul>
          <li>Put <code>log4j.jar</code> and
            <code>tomcat-juli-adapters.jar</code> from "extras" into
            <code>$CATALINA_HOME/lib</code>.</li>
          <li>Replace <code>$CATALINA_HOME/bin/tomcat-juli.jar</code> with
          <code>tomcat-juli.jar</code> from "extras".</li>
        </ul>
        </li>

        <li><p>If you are running Tomcat with separate
        <code>$CATALINA_HOME</code> and <code>$CATALINA_BASE</code> and want to
        configure to use log4j in a single <code>$CATALINA_BASE</code> only:</p>

        <ul>
          <li>Create <code>$CATALINA_BASE/bin</code> and
          <code>$CATALINA_BASE/lib</code> directories if they do not exist.
          </li>
          <li>Put <code>log4j.jar</code> and
             <code>tomcat-juli-adapters.jar</code> from "extras" into
             <code>$CATALINA_BASE/lib</code></li>
          <li>Put <code>tomcat-juli.jar</code> from "extras" as
          <code>$CATALINA_BASE/bin/tomcat-juli.jar</code></li>
          <li>If you are running with a
          <a href="security-manager-howto.html">security manager</a>, you
          would need to edit the
          <code>$CATALINA_BASE/conf/catalina.policy</code> file to adjust
          it to using a different copy of tomcat-juli.jar.</li>
        </ul>

        <p>Note: This works because libraries, if they exist in
        <code>$CATALINA_BASE</code>, are loaded in preference to the same
        library in <code>$CATALINA_HOME</code>.</p>

        <p>Note: tomcat-juli.jar is loaded from <code>$CATALINA_BASE</code>/bin
        not <code>$CATALINA_BASE</code>/lib as it is loaded as part of the
        bootstrap process and all the bootstrap classes are loaded from bin.</p>
        </li>

        <li><p>Delete <code>$CATALINA_BASE/conf/logging.properties</code> to
        prevent java.util.logging generating zero length log files.</p></li>

        <li><p>Start Tomcat</p></li>
    </ol>

    <p>
      This log4j configuration mirrors the default java.util.logging setup
      that ships with Tomcat: both the manager and host-manager apps get an
      individual log file, and everything else goes to the "catalina.log" log
      file. Each file is rolled-over once per day.
    </p>

    <p>
      You can (and should) be more picky about which packages to include
      in the logging. Tomcat defines loggers by Engine and Host names.
      For example, for a more detailed Catalina localhost log, add this to the
      end of the log4j.properties above. Note that there are known issues with
      using this naming convention (with square brackets) in log4j XML based
      configuration files, so we recommend you use a properties file as
      described until a future version of log4j allows this convention.
    </p>
      <source><![CDATA[log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG
log4j.logger.org.apache.catalina.core=DEBUG
log4j.logger.org.apache.catalina.session=DEBUG]]></source>

    <p>
      Be warned: a level of DEBUG will produce megabytes of logging and slow
      startup of Tomcat. This level should be used sparingly when debugging of
      internal Tomcat operations is required.
    </p>

    <p>
      Your web applications should certainly use their own log4j configuration.
      This is valid <i>with</i> the above configuration.  You would place a
      similar log4j.properties file in your web application's WEB-INF/classes
      directory, and log4jx.y.z.jar into WEB-INF/lib. Then specify your package
      level logging. This is a basic setup of log4j which does *not* require
      Commons-Logging, and you should consult the
      <a href="http://logging.apache.org/log4j/docs/documentation.html">log4j
      documentation</a> for more options. This page is intended only as a
      bootstrapping guide.
    </p>

    <p><em>Additional notes</em></p>
    <ul>
        <li><p>This exposes log4j libraries to the web applications through the
        Common classloader. See <a href="class-loader-howto.html">class loading</a>
        documentation for details.</p>
        <p>Because of that, the web applications and libraries using
        <a href="http://commons.apache.org/logging">Apache Commons Logging</a>
        library are likely to automatically choose log4j as the underlying
        logging implementation.</p></li>

        <li><p>The <code>java.util.logging</code> API is still available for
        those web applications that use it directly.  The
        <code>${catalina.base}/conf/logging.properties</code> file is still
        referenced by Tomcat startup scripts.  For more information, see the
        subsections of the <a href="#Introduction">Introduction</a> to
        this page.</p>
        <p> Removal of <code>${catalina.base}/conf/logging.properties</code>
        file, mentioned as one of the steps above, causes
        <code>java.util.logging</code> to fallback to the default
        configuration for the JRE, which is to use a ConsoleHandler
        and therefore not create any standard log files.  You should
        confirm that all your log files are being created by log4j
        <i>before</i> disabling the standard mechanism.</p></li>

        <li><p>The <strong>Access Log Valve</strong> and
        <strong>ExtendedAccessLogValve</strong> use their own self-contained
        logging implementation, so they
        <strong><i>cannot be configured to use log4j</i></strong>.
        Refer to <a href="config/valve.html#Access_Logging">Valves</a>
        for specific configuration details.</p></li>
    </ul>
  </section>

</body>
</document>
