|  | <?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\" %>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>%>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\" %>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\" %>s %b" common | 
|  | CustomLog "logs/access_log" common | 
|  | CustomLog "logs/referer_log" "%{Referer}i -> %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\" %>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> | 
|  |  | 
|  |  | 
|  |  | 
|  |  |