<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.en.xsl"?>
<!-- $LastChangedRevision$ -->

<!--
 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.
-->

<manualpage metafile="logs.xml.meta">

  <title>Log Files</title>

  <summary>
    <p>In order to effectively manage a web server, it is necessary
    to get feedback about the activity and performance of the
    server as well as any problems that may be occurring. The Apache HTTP Server
    provides very comprehensive and flexible logging
    capabilities. This document describes how to configure its
    logging capabilities, and how to understand what the logs
    contain.</p>
  </summary>

    <section id="overview">
    <title>Overview</title>

  <related>
      <modulelist>
        <module>mod_log_config</module>
        <module>mod_log_forensic</module>
        <module>mod_logio</module>
        <module>mod_cgi</module>
      </modulelist>
  </related>

  <p>
  The Apache HTTP Server provides a variety of different mechanisms for
  logging everything that happens on your server, from the initial
  request, through the URL mapping process, to the final resolution of
  the connection, including any errors that may have occurred in the
  process. In addition to this, third-party modules may provide logging
  capabilities, or inject entries into the existing log files, and
  applications such as CGI programs, or PHP scripts, or other handlers,
  may send messages to the server error log.
  </p>

  <p>
  In this document we discuss the logging modules that are a standard
  part of the http server.
  </p>

  </section>

  <section id="security">
    <title>Security Warning</title>

    <p>Anyone who can write to the directory where Apache httpd is
    writing a log file can almost certainly gain access to the uid
    that the server is started as, which is normally root. Do
    <em>NOT</em> give people write access to the directory the logs
    are stored in without being aware of the consequences; see the
    <a href="misc/security_tips.html">security tips</a> document
    for details.</p>

    <p>In addition, log files may contain information supplied
    directly by the client, without escaping. Therefore, it is
    possible for malicious clients to insert control-characters in
    the log files, so care must be taken in dealing with raw
    logs.</p>
  </section>

  <section id="errorlog">
    <title>Error Log</title>

    <related>
      <modulelist>
        <module>core</module>
      </modulelist>
      <directivelist>
        <directive module="core">ErrorLog</directive>
        <directive module="core">ErrorLogFormat</directive>
        <directive module="core">LogLevel</directive>
      </directivelist>
    </related>

    <p>The server error log, whose name and location is set by the
    <directive module="core">ErrorLog</directive> directive, is the
    most important log file. This is the place where Apache httpd
    will send diagnostic information and record any errors that it
    encounters in processing requests. It is the first place to
    look when a problem occurs with starting the server or with the
    operation of the server, since it will often contain details of
    what went wrong and how to fix it.</p>

    <p>The error log is usually written to a file (typically
    <code>error_log</code> on Unix systems and
    <code>error.log</code> on Windows and OS/2). On Unix systems it
    is also possible to have the server send errors to
    <code>syslog</code> or <a href="#piped">pipe them to a
    program</a>.</p>

    <p>The format of the error log is defined by the <directive
    module="core">ErrorLogFormat</directive> directive, with which you
    can customize what values are logged. A default is format defined
    if you don't specify one. A typical log message follows:</p>

    <example>
    [Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416]
    [client 72.15.99.187] File does not exist: /usr/local/apache2/htdocs/favicon.ico
    </example>

    <p>The first item in the log entry is the date and time of the
    message. The next is the module producing the message (core, in this
    case) and the severity level of that message. This is followed by
    the process ID and, if appropriate, the thread ID, of the process
    that experienced the condition. Next, we have the client address
    that made the request. And finally is the detailed error message,
    which in this case indicates a request for a file that did not
    exist.</p>

    <p>A very wide variety of different messages can appear in the
    error log. Most look similar to the example above. The error
    log will also contain debugging output from CGI scripts. Any
    information written to <code>stderr</code> by a CGI script will
    be copied directly to the error log.</p>

    <p>Putting a <code>%L</code> token in both the error log and the access
    log will produce a log entry ID with which you can correlate the entry
    in the error log with the entry in the access log. If
    <module>mod_unique_id</module> is loaded, its unique request ID will be
    used as the log entry ID, too.</p>

    <p>During testing, it is often useful to continuously monitor
    the error log for any problems. On Unix systems, you can
    accomplish this using:</p>

    <example>
      tail -f error_log
    </example>
  </section>

  <section id="permodule">
    <title>Per-module logging</title>

    <p>The <directive module="core">LogLevel</directive> directive
    allows you to specify a log severity level on a per-module basis. In
    this way, if you are troubleshooting a problem with just one
    particular module, you can turn up its logging volume without also
    getting the details of other modules that you're not interested in.
    This is particularly useful for modules such as
    <module>mod_proxy</module> or <module>mod_rewrite</module> where you
    want to know details about what it's trying to do.</p>

    <p>Do this by specifying the name of the module in your
    <directive>LogLevel</directive> directive:</p>

    <highlight language="config">
    LogLevel info rewrite:trace5
    </highlight>

    <p>This sets the main <directive>LogLevel</directive> to info, but
    turns it up to <code>trace5</code> for
    <module>mod_rewrite</module>.</p>

    <note>This replaces the per-module logging directives, such as
    <code>RewriteLog</code>, that were present in earlier versions of
    the server.</note>
  </section>

  <section id="accesslog">
    <title>Access Log</title>

    <related>
      <modulelist>
        <module>mod_log_config</module>
        <module>mod_setenvif</module>
      </modulelist>
      <directivelist>
        <directive module="mod_log_config">CustomLog</directive>
        <directive module="mod_log_config">LogFormat</directive>
        <directive module="mod_setenvif">SetEnvIf</directive>
      </directivelist>
    </related>

    <p>The server access log records all requests processed by the
    server. The location and content of the access log are
    controlled by the <directive module="mod_log_config">CustomLog</directive>
    directive. The <directive module="mod_log_config">LogFormat</directive>
    directive can be used to simplify the selection of
    the contents of the logs. This section describes how to configure the server
    to record information in the access log.</p>

    <p>Of course, storing the information in the access log is only
    the start of log management. The next step is to analyze this
    information to produce useful statistics. Log analysis in
    general is beyond the scope of this document, and not really
    part of the job of the web server itself. For more information
    about this topic, and for applications which perform log
    analysis, check the <a
    href="http://dmoz.org/Computers/Software/Internet/Site_Management/Log_Analysis/">
    Open Directory</a>.
    </p>

    <p>Various versions of Apache httpd have used other modules and
    directives to control access logging, including
    mod_log_referer, mod_log_agent, and the
    <code>TransferLog</code> directive. The <directive
    module="mod_log_config">CustomLog</directive> directive now subsumes
    the functionality of all the older directives.</p>

    <p>The format of the access log is highly configurable. The format
    is specified using a format string that looks much like a C-style
    printf(1) format string. Some examples are presented in the next
    sections. For a complete list of the possible contents of the
    format string, see the <module>mod_log_config</module> <a
    href="mod/mod_log_config.html#formats">format strings</a>.</p>

    <section id="common">
      <title>Common Log Format</title>

      <p>A typical configuration for the access log might look as
      follows.</p>

      <highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog "logs/access_log" common
      </highlight>

      <p>This defines the <em>nickname</em> <code>common</code> and
      associates it with a particular log format string. The format
      string consists of percent directives, each of which tell the
      server to log a particular piece of information. Literal
      characters may also be placed in the format string and will be
      copied directly into the log output. The quote character
      (<code>"</code>) must be escaped by placing a backslash before
      it to prevent it from being interpreted as the end of the
      format string. The format string may also contain the special
      control characters "<code>\n</code>" for new-line and
      "<code>\t</code>" for tab.</p>

      <p>The <directive module="mod_log_config">CustomLog</directive>
      directive sets up a new log file using the defined
      <em>nickname</em>. The filename for the access log is relative to
      the <directive module="core">ServerRoot</directive> unless it
      begins with a slash.</p>

      <p>The above configuration will write log entries in a format
      known as the Common Log Format (CLF). This standard format can
      be produced by many different web servers and read by many log
      analysis programs. The log file entries produced in CLF will
      look something like this:</p>

      <example>
        127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
        /apache_pb.gif HTTP/1.0" 200 2326
      </example>

      <p>Each part of this log entry is described below.</p>

      <dl>
        <dt><code>127.0.0.1</code> (<code>%h</code>)</dt>

        <dd>This is the IP address of the client (remote host) which
        made the request to the server. If <directive
        module="core">HostnameLookups</directive> is
        set to <code>On</code>, then the server will try to determine
        the hostname and log it in place of the IP address. However,
        this configuration is not recommended since it can
        significantly slow the server. Instead, it is best to use a
        log post-processor such as <program>logresolve</program> to determine
        the hostnames. The IP address reported here is not
        necessarily the address of the machine at which the user is
        sitting. If a proxy server exists between the user and the
        server, this address will be the address of the proxy, rather
        than the originating machine.</dd>

        <dt><code>-</code> (<code>%l</code>)</dt>

        <dd>The "hyphen" in the output indicates that the requested
        piece of information is not available. In this case, the
        information that is not available is the RFC 1413 identity of
        the client determined by <code>identd</code> on the clients
        machine. This information is highly unreliable and should
        almost never be used except on tightly controlled internal
        networks. Apache httpd will not even attempt to determine
        this information unless <directive
        module="mod_ident">IdentityCheck</directive> is set
        to <code>On</code>.</dd>

        <dt><code>frank</code> (<code>%u</code>)</dt>

        <dd>This is the userid of the person requesting the document
        as determined by HTTP authentication. The same value is
        typically provided to CGI scripts in the
        <code>REMOTE_USER</code> environment variable. If the status
        code for the request (see below) is 401, then this value
        should not be trusted because the user is not yet
        authenticated. If the document is not password protected,
        this part will be "<code>-</code>" just like the previous
        one.</dd>

        <dt><code>[10/Oct/2000:13:55:36 -0700]</code>
        (<code>%t</code>)</dt>

        <dd>
          The time that the request was received.
          The format is:

          <p class="indent">
            <code>[day/month/year:hour:minute:second zone]<br />
             day = 2*digit<br />
             month = 3*letter<br />
             year = 4*digit<br />
             hour = 2*digit<br />
             minute = 2*digit<br />
             second = 2*digit<br />
             zone = (`+' | `-') 4*digit</code>
          </p>
          <p>It is possible to have the time displayed in another format
          by specifying <code>%{format}t</code> in the log format
          string, where <code>format</code> is either as in
          <code>strftime(3)</code> from the C standard library,
          or one of the supported special tokens. For details see
          the <module>mod_log_config</module> <a
          href="mod/mod_log_config.html#formats">format strings</a>.</p>
        </dd>

        <dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
        (<code>\"%r\"</code>)</dt>

        <dd>The request line from the client is given in double
        quotes. The request line contains a great deal of useful
        information. First, the method used by the client is
        <code>GET</code>. Second, the client requested the resource
        <code>/apache_pb.gif</code>, and third, the client used the
        protocol <code>HTTP/1.0</code>. It is also possible to log
        one or more parts of the request line independently. For
        example, the format string "<code>%m %U%q %H</code>" will log
        the method, path, query-string, and protocol, resulting in
        exactly the same output as "<code>%r</code>".</dd>

        <dt><code>200</code> (<code>%&gt;s</code>)</dt>

        <dd>This is the status code that the server sends back to the
        client. This information is very valuable, because it reveals
        whether the request resulted in a successful response (codes
        beginning in 2), a redirection (codes beginning in 3), an
        error caused by the client (codes beginning in 4), or an
        error in the server (codes beginning in 5). The full list of
        possible status codes can be found in the <a
        href="http://www.w3.org/Protocols/rfc2616/rfc2616.txt">HTTP
        specification</a> (RFC2616 section 10).</dd>

        <dt><code>2326</code> (<code>%b</code>)</dt>

        <dd>The last part indicates the size of the object returned
        to the client, not including the response headers. If no
        content was returned to the client, this value will be
        "<code>-</code>". To log "<code>0</code>" for no content, use
        <code>%B</code> instead.</dd>
      </dl>
    </section>

    <section id="combined">
      <title>Combined Log Format</title>

      <p>Another commonly used format string is called the Combined
      Log Format. It can be used as follows.</p>

      <highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog "log/access_log" combined
      </highlight>

      <p>This format is exactly the same as the Common Log Format,
      with the addition of two more fields. Each of the additional
      fields uses the percent-directive
      <code>%{<em>header</em>}i</code>, where <em>header</em> can be
      any HTTP request header. The access log under this format will
      look like:</p>

      <example>
        127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
        /apache_pb.gif HTTP/1.0" 200 2326
        "http://www.example.com/start.html" "Mozilla/4.08 [en]
        (Win98; I ;Nav)"
      </example>

      <p>The additional fields are:</p>

      <dl>
        <dt><code>"http://www.example.com/start.html"</code>
        (<code>\"%{Referer}i\"</code>)</dt>

        <dd>The "Referer" (sic) HTTP request header. This gives the
        site that the client reports having been referred from. (This
        should be the page that links to or includes
        <code>/apache_pb.gif</code>).</dd>

        <dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
        (<code>\"%{User-agent}i\"</code>)</dt>

        <dd>The User-Agent HTTP request header. This is the
        identifying information that the client browser reports about
        itself.</dd>
      </dl>
    </section>

    <section id="multiple">
      <title>Multiple Access Logs</title>

      <p>Multiple access logs can be created simply by specifying
      multiple <directive module="mod_log_config">CustomLog</directive>
      directives in the configuration
      file. For example, the following directives will create three
      access logs. The first contains the basic CLF information,
      while the second and third contain referer and browser
      information. The last two <directive
      module="mod_log_config">CustomLog</directive> lines show how
      to mimic the effects of the <code>ReferLog</code> and <code
      >AgentLog</code> directives.</p>

      <highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog "logs/access_log" common
CustomLog "logs/referer_log" "%{Referer}i -&gt; %U"
CustomLog "logs/agent_log" "%{User-agent}i"
      </highlight>

      <p>This example also shows that it is not necessary to define a
      nickname with the <directive
      module="mod_log_config">LogFormat</directive> directive. Instead,
      the log format can be specified directly in the <directive
      module="mod_log_config">CustomLog</directive> directive.</p>
    </section>

    <section id="conditional">
      <title>Conditional Logs</title>

      <p>There are times when it is convenient to exclude certain
      entries from the access logs based on characteristics of the
      client request. This is easily accomplished with the help of <a
      href="env.html">environment variables</a>. First, an
      environment variable must be set to indicate that the request
      meets certain conditions. This is usually accomplished with
      <directive module="mod_setenvif">SetEnvIf</directive>. Then the
      <code>env=</code> clause of the <directive
      module="mod_log_config">CustomLog</directive> directive is used to
      include or exclude requests where the environment variable is
      set. Some examples:</p>

      <highlight language="config">
# Mark requests from the loop-back interface
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains
CustomLog "logs/access_log" common env=!dontlog
      </highlight>

      <p>As another example, consider logging requests from
      english-speakers to one log file, and non-english speakers to a
      different log file.</p>

      <highlight language="config">
SetEnvIf Accept-Language "en" english
CustomLog "logs/english_log" common env=english
CustomLog "logs/non_english_log" common env=!english
      </highlight>

      <p>In a caching scenario one would want to know about
      the efficiency of the cache. A very simple method to
      find this out would be:</p>

      <highlight language="config">
SetEnv CACHE_MISS 1
LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache
CustomLog "logs/access_log" common-cache
      </highlight>

      <p><module>mod_cache</module> will run before
      <module>mod_env</module> and, when successful, will deliver the
      content without it. In that case a cache hit will log
      <code>-</code>, while a cache miss will log <code>1</code>.</p>

      <p>In addition to the <code>env=</code> syntax, <directive
      module="mod_log_config">LogFormat</directive> supports logging values
      conditional upon the HTTP response code:</p>

      <highlight language="config">
LogFormat "%400,501{User-agent}i" browserlog
LogFormat "%!200,304,302{Referer}i" refererlog
      </highlight>

      <p>In the first example, the <code>User-agent</code> will be
      logged if the HTTP status code is 400 or 501. In other cases, a
      literal "-" will be logged instead. Likewise, in the second
      example, the <code>Referer</code> will be logged if the HTTP
      status code is <strong>not</strong> 200, 204, or 302. (Note the
      "!" before the status codes.</p>

      <p>Although we have just shown that conditional logging is very
      powerful and flexible, it is not the only way to control the
      contents of the logs. Log files are more useful when they
      contain a complete record of server activity. It is often
      easier to simply post-process the log files to remove requests
      that you do not want to consider.</p>
    </section>
  </section>

  <section id="rotation">
    <title>Log Rotation</title>

    <p>On even a moderately busy server, the quantity of
    information stored in the log files is very large. The access
    log file typically grows 1 MB or more per 10,000 requests. It
    will consequently be necessary to periodically rotate the log
    files by moving or deleting the existing logs. This cannot be
    done while the server is running, because Apache httpd will continue
    writing to the old log file as long as it holds the file open.
    Instead, the server must be <a
    href="stopping.html">restarted</a> after the log files are
    moved or deleted so that it will open new log files.</p>

    <p>By using a <em>graceful</em> restart, the server can be
    instructed to open new log files without losing any existing or
    pending connections from clients. However, in order to
    accomplish this, the server must continue to write to the old
    log files while it finishes serving old requests. It is
    therefore necessary to wait for some time after the restart
    before doing any processing on the log files. A typical
    scenario that simply rotates the logs and compresses the old
    logs to save space is:</p>

    <example>
      mv access_log access_log.old<br />
      mv error_log error_log.old<br />
      apachectl graceful<br />
      sleep 600<br />
      gzip access_log.old error_log.old
    </example>

    <p>Another way to perform log rotation is using <a
    href="#piped">piped logs</a> as discussed in the next
    section.</p>
  </section>

  <section id="piped">
    <title>Piped Logs</title>

    <p>Apache httpd is capable of writing error and access log
    files through a pipe to another process, rather than directly
    to a file. This capability dramatically increases the
    flexibility of logging, without adding code to the main server.
    In order to write logs to a pipe, simply replace the filename
    with the pipe character "<code>|</code>", followed by the name
    of the executable which should accept log entries on its
    standard input. The server will start the piped-log process when
    the server starts, and will restart it if it crashes while the
    server is running. (This last feature is why we can refer to
    this technique as "reliable piped logging".)</p>

    <p>Piped log processes are spawned by the parent Apache httpd
    process, and inherit the userid of that process. This means
    that piped log programs usually run as root. It is therefore
    very important to keep the programs simple and secure.</p>

    <p>One important use of piped logs is to allow log rotation
    without having to restart the server. The Apache HTTP Server
    includes a simple program called <program>rotatelogs</program>
    for this purpose. For example, to rotate the logs every 24 hours, you
    can use:</p>

    <highlight language="config">
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
    </highlight>

    <p>Notice that quotes are used to enclose the entire command
    that will be called for the pipe. Although these examples are
    for the access log, the same technique can be used for the
    error log.</p>

    <p>As with conditional logging, piped logs are a very powerful
    tool, but they should not be used where a simpler solution like
    off-line post-processing is available.</p>

    <p>By default the piped log process is spawned without invoking
    a shell. Use "<code>|$</code>" instead of "<code>|</code>"
    to spawn using a shell (usually with <code>/bin/sh -c</code>):</p>

    <highlight language="config">
# Invoke "rotatelogs" using a shell
CustomLog "|$/usr/local/apache/bin/rotatelogs   /var/log/access_log 86400" common
    </highlight>

    <p>This was the default behaviour for Apache 2.2.
    Depending on the shell specifics this might lead to
    an additional shell process for the lifetime of the logging
    pipe program and signal handling problems during restart.
    For compatibility reasons with Apache 2.2 the notation
    "<code>||</code>" is also supported and equivalent to using
    "<code>|</code>".</p>

    <note><title>Windows note</title>
    <p>Note that on Windows, you may run into problems when running many piped
    logger processes, especially when HTTPD is running as a service. This is
    caused by running out of desktop heap space. The desktop heap space given
    to each service is specified by the third argument to the
    <code>SharedSection</code> parameter in the
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\SubSystems\Windows
    registry value. <strong>Change this value with care</strong>; the normal
    caveats for changing the Windows registry apply, but you might also exhaust
    the desktop heap pool if the number is adjusted too high.</p>
    </note>
  </section>

  <section id="virtualhost">
    <title>Virtual Hosts</title>

    <p>When running a server with many <a href="vhosts/">virtual
    hosts</a>, there are several options for dealing with log
    files. First, it is possible to use logs exactly as in a
    single-host server. Simply by placing the logging directives
    outside the <directive module="core"
    type="section">VirtualHost</directive> sections in the
    main server context, it is possible to log all requests in the
    same access log and error log. This technique does not allow
    for easy collection of statistics on individual virtual
    hosts.</p>

    <p>If <directive module="mod_log_config">CustomLog</directive>
    or <directive module="core">ErrorLog</directive>
    directives are placed inside a
    <directive module="core" type="section">VirtualHost</directive>
    section, all requests or errors for that virtual host will be
    logged only to the specified file. Any virtual host which does
    not have logging directives will still have its requests sent
    to the main server logs. This technique is very useful for a
    small number of virtual hosts, but if the number of hosts is
    very large, it can be complicated to manage. In addition, it
    can often create problems with <a
    href="vhosts/fd-limits.html">insufficient file
    descriptors</a>.</p>

    <p>For the access log, there is a very good compromise. By
    adding information on the virtual host to the log format
    string, it is possible to log all hosts to the same log, and
    later split the log into individual files. For example,
    consider the following directives.</p>

    <highlight language="config">
LogFormat "%v %l %u %t \"%r\" %&gt;s %b" comonvhost
CustomLog "logs/access_log" comonvhost
    </highlight>

    <p>The <code>%v</code> is used to log the name of the virtual
    host that is serving the request. Then a program like <a
    href="programs/split-logfile.html">split-logfile</a> can be used to
    post-process the access log in order to split it into one file
    per virtual host.</p>
  </section>

  <section id="other">
    <title>Other Log Files</title>

    <related>
      <modulelist>
        <module>mod_logio</module>
        <module>mod_log_config</module>
        <module>mod_log_forensic</module>
        <module>mod_cgi</module>
      </modulelist>

      <directivelist>
        <directive module="mod_log_config">LogFormat</directive>
        <directive module="mod_log_config">BufferedLogs</directive>
        <directive module="mod_log_forensic">ForensicLog</directive>
        <directive module="mpm_common">PidFile</directive>
        <directive module="mod_cgi">ScriptLog</directive>
        <directive module="mod_cgi">ScriptLogBuffer</directive>
        <directive module="mod_cgi">ScriptLogLength</directive>
      </directivelist>
    </related>

    <section>
      <title>Logging actual bytes sent and received</title>

      <p><module>mod_logio</module> adds in two additional
         <directive module="mod_log_config">LogFormat</directive> fields
         (%I and %O) that log the actual number of bytes received and sent
         on the network.</p>
    </section>

    <section>
      <title>Forensic Logging</title>

      <p><module>mod_log_forensic</module> provides for forensic logging of
         client requests. Logging is done before and after processing a
         request, so the forensic log contains two log lines for each
         request. The forensic logger is very strict with no customizations.
         It can be an invaluable debugging and security tool.</p>
    </section>

    <section id="pidfile">
      <title>PID File</title>

      <p>On startup, Apache httpd saves the process id of the parent
      httpd process to the file <code>logs/httpd.pid</code>. This
      filename can be changed with the <directive
      module="mpm_common">PidFile</directive> directive. The
      process-id is for use by the administrator in restarting and
      terminating the daemon by sending signals to the parent
      process; on Windows, use the -k command line option instead.
      For more information see the <a href="stopping.html">Stopping
      and Restarting</a> page.</p>
    </section>

    <section id="scriptlog">
      <title>Script Log</title>

      <p>In order to aid in debugging, the
      <directive module="mod_cgi">ScriptLog</directive> directive
      allows you to record the input to and output from CGI scripts.
      This should only be used in testing - not for live servers.
      More information is available in the <a
      href="mod/mod_cgi.html">mod_cgi</a> documentation.</p>
    </section>

  </section>
</manualpage>




