| <?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] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error | |
| </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.</p> | |
| <note><p>Note that some messages that were previously logged at | |
| <code>error</code> level have been downgraded to <code>info</code> | |
| level in httpd 2.4. For example, "File does not exist" messages | |
| for 404 responses are logged at <code>info</code> level and will | |
| not appear in the error log with the default | |
| <directive module="core">LogLevel</directive> of <code>warn</code>. | |
| To restore the previous behavior, use | |
| <code>LogLevel warn core:info</code>.</p></note> | |
| <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> | |
| <example> | |
| <highlight language="config"> | |
| LogLevel info rewrite:trace5 | |
| </highlight> | |
| </example> | |
| <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>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. | |
| </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> | |
| <example> | |
| <highlight language="config"> | |
| LogFormat "%h %l %u %t \"%r\" %>s %b" common | |
| CustomLog "logs/access_log" common | |
| </highlight> | |
| </example> | |
| <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 HTTP specification (<rfc>2616</rfc>) (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> | |
| <example> | |
| <highlight language="config"> | |
| LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined | |
| CustomLog "log/access_log" combined | |
| </highlight> | |
| </example> | |
| <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> | |
| <example> | |
| <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> | |
| </example> | |
| <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> | |
| <example> | |
| <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> | |
| </example> | |
| <p>As another example, consider logging requests from | |
| english-speakers to one log file, and non-english speakers to a | |
| different log file.</p> | |
| <example> | |
| <highlight language="config"> | |
| SetEnvIf Accept-Language "en" english | |
| CustomLog "logs/english_log" common env=english | |
| CustomLog "logs/non_english_log" common env=!english | |
| </highlight> | |
| </example> | |
| <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> | |
| <example> | |
| <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> | |
| </example> | |
| <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> | |
| <example> | |
| <highlight language="config"> | |
| LogFormat "%400,501{User-agent}i" browserlog | |
| LogFormat "%!200,304,302{Referer}i" refererlog | |
| </highlight> | |
| </example> | |
| <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, 304, 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, log files grow quickly — | |
| the access log typically grows 1 MB or more per 10,000 requests. | |
| Without rotation, logs consume disk space indefinitely and become | |
| unwieldy to analyze. You should set up automatic log rotation from | |
| the start.</p> | |
| <section id="rotation-rotatelogs"> | |
| <title>Using rotatelogs (recommended)</title> | |
| <p>The simplest approach is to use httpd's built-in | |
| <program>rotatelogs</program> program via <a href="#piped">piped | |
| logs</a>. This rotates logs without requiring a server restart | |
| and without any external tools. To rotate logs every 24 hours:</p> | |
| <example> | |
| <highlight language="config"> | |
| CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 86400" combined | |
| ErrorLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/error_log 86400" | |
| </highlight> | |
| </example> | |
| <p>To rotate when the log reaches a certain size (e.g., 100 MB):</p> | |
| <example> | |
| <highlight language="config"> | |
| CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 100M" combined | |
| </highlight> | |
| </example> | |
| <p>You can also use a time-based filename pattern with | |
| <code>strftime</code> format strings:</p> | |
| <example> | |
| <highlight language="config"> | |
| CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400" combined | |
| </highlight> | |
| </example> | |
| <p>See <program>rotatelogs</program> for the full set of options, | |
| including offset times, file count limits, and compression.</p> | |
| </section> | |
| <section id="rotation-logrotate"> | |
| <title>Using logrotate or system log management</title> | |
| <p>Most Linux distributions include <code>logrotate</code>, which | |
| can rotate, compress, and expire log files on a schedule. If your | |
| distribution already ships an httpd logrotate configuration (check | |
| <code>/etc/logrotate.d/</code>), it may already be handling rotation | |
| for you.</p> | |
| <p>When using an external rotation tool like <code>logrotate</code>, | |
| you need to signal httpd to reopen its log files after | |
| the old ones are moved aside. The standard approach is a | |
| <em>graceful</em> restart:</p> | |
| <example> | |
| <highlight language="sh"> | |
| /usr/sbin/apachectl graceful | |
| </highlight> | |
| </example> | |
| <p>Your logrotate configuration's <code>postrotate</code> script | |
| should include this (or the equivalent | |
| <code>systemctl reload</code> command). httpd continues writing to | |
| the old file handle until it receives the signal, so any post-processing | |
| of rotated files should allow a brief delay.</p> | |
| </section> | |
| </section> | |
| <section id="piped"> | |
| <title>Piped Logs</title> | |
| <p>httpd can write error and access log files through a pipe to | |
| another process, rather than directly to a file. To use a piped | |
| log, replace the filename with the pipe character | |
| "<code>|</code>", followed by the command that should receive | |
| log entries on its standard input:</p> | |
| <example> | |
| <highlight language="config"> | |
| CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 86400" combined | |
| </highlight> | |
| </example> | |
| <p>httpd starts the piped-log process at server startup and | |
| restarts it automatically if it crashes (this is sometimes called | |
| "reliable piped logging"). The quotes enclose the entire piped | |
| command — this syntax works for both | |
| <directive module="mod_log_config">CustomLog</directive> and | |
| <directive module="core">ErrorLog</directive>.</p> | |
| <p>Piped log processes are spawned by the parent httpd process and | |
| inherit its userid. This typically means they run as root, so keep | |
| piped log programs simple and secure.</p> | |
| <p>By default the piped log process is spawned directly, without | |
| invoking a shell. Use "<code>|$</code>" instead of | |
| "<code>|</code>" to spawn via a shell (usually | |
| <code>/bin/sh -c</code>):</p> | |
| <example> | |
| <highlight language="config"> | |
| CustomLog "|$/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 86400" combined | |
| </highlight> | |
| </example> | |
| <p>The shell variant is occasionally needed if your piped command | |
| uses shell features like globbing or variable expansion. For most | |
| cases, the direct (non-shell) invocation is preferred.</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> | |
| <example> | |
| <highlight language="config"> | |
| LogFormat "%v %p %h %l %u %t \"%r\" %>s %b" commonvhost | |
| CustomLog "logs/access_log" commonvhost | |
| </highlight> | |
| </example> | |
| <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_debug</module> | |
| <module>mod_log_forensic</module> | |
| <module>mod_cgi</module> | |
| </modulelist> | |
| <directivelist> | |
| <directive module="mod_log_config">BufferedLogs</directive> | |
| <directive module="mod_log_forensic">ForensicLog</directive> | |
| <directive module="mod_log_config">LogFormat</directive> | |
| <directive module="mod_log_debug">LogMessage</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 id="debug"> | |
| <title>Configurable debug logging</title> | |
| <p>The <directive module="mod_log_debug">LogMessage</directive> | |
| lets you create your own custom log messages to aid in debugging. | |
| </p> | |
| </section> | |
| </section> | |
| </manualpage> | |