]> granicus.if.org Git - apache/blob - docs/manual/logs.html.en
update xforms
[apache] / docs / manual / logs.html.en
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
4         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5               This file is generated from xml source: DO NOT EDIT
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7       -->
8 <title>Log Files - Apache HTTP Server</title>
9 <link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10 <link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11 <link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
12 <link href="./images/favicon.ico" rel="shortcut icon" /></head>
13 <body id="manual-page"><div id="page-header">
14 <p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p>
15 <p class="apache">Apache HTTP Server Version 2.3</p>
16 <img alt="" src="./images/feather.gif" /></div>
17 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
18 <div id="path">
19 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="./">Version 2.3</a></div><div id="page-content"><div id="preamble"><h1>Log Files</h1>
20 <div class="toplang">
21 <p><span>Available Languages: </span><a href="./en/logs.html" title="English">&nbsp;en&nbsp;</a> |
22 <a href="./fr/logs.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
23 <a href="./ja/logs.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
24 <a href="./ko/logs.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
25 <a href="./tr/logs.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
26 </div>
27
28     <p>In order to effectively manage a web server, it is necessary
29     to get feedback about the activity and performance of the
30     server as well as any problems that may be occurring. The Apache HTTP Server 
31     provides very comprehensive and flexible logging
32     capabilities. This document describes how to configure its
33     logging capabilities, and how to understand what the logs
34     contain.</p>
35   </div>
36 <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#overview">Overview</a></li>
37 <li><img alt="" src="./images/down.gif" /> <a href="#security">Security Warning</a></li>
38 <li><img alt="" src="./images/down.gif" /> <a href="#errorlog">Error Log</a></li>
39 <li><img alt="" src="./images/down.gif" /> <a href="#permodule">Per-module logging</a></li>
40 <li><img alt="" src="./images/down.gif" /> <a href="#accesslog">Access Log</a></li>
41 <li><img alt="" src="./images/down.gif" /> <a href="#rotation">Log Rotation</a></li>
42 <li><img alt="" src="./images/down.gif" /> <a href="#piped">Piped Logs</a></li>
43 <li><img alt="" src="./images/down.gif" /> <a href="#virtualhost">Virtual Hosts</a></li>
44 <li><img alt="" src="./images/down.gif" /> <a href="#other">Other Log Files</a></li>
45 </ul></div>
46 <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
47 <div class="section">
48 <h2><a name="overview" id="overview">Overview</a></h2>
49     
50
51   <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_log_config.html">mod_log_config</a></code></li><li><code class="module"><a href="./mod/mod_log_forensic.html">mod_log_forensic</a></code></li><li><code class="module"><a href="./mod/mod_logio.html">mod_logio</a></code></li><li><code class="module"><a href="./mod/mod_cgi.html">mod_cgi</a></code></li></ul></td><td /></tr></table>
52
53   <p>
54   The Apache HTTP Server provides a variety of different mechanisms for
55   logging everything that happens on your server, from the initial
56   request, through the URL mapping process, to the final resolution of
57   the connection, including any errors that may have occurred in the
58   process. In addition to this, third-party modules may provide logging
59   capabilities, or inject entries into the existing log files, and
60   applications such as CGI programs, or PHP scripts, or other handlers,
61   may send messages to the server error log.
62   </p>
63
64   <p>
65   In this document we discuss the logging modules that are a standard
66   part of the http server.
67   </p>
68
69   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
70 <div class="section">
71 <h2><a name="security" id="security">Security Warning</a></h2>
72     
73
74     <p>Anyone who can write to the directory where Apache httpd is
75     writing a log file can almost certainly gain access to the uid
76     that the server is started as, which is normally root. Do
77     <em>NOT</em> give people write access to the directory the logs
78     are stored in without being aware of the consequences; see the
79     <a href="misc/security_tips.html">security tips</a> document
80     for details.</p>
81
82     <p>In addition, log files may contain information supplied
83     directly by the client, without escaping. Therefore, it is
84     possible for malicious clients to insert control-characters in
85     the log files, so care must be taken in dealing with raw
86     logs.</p>
87   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
88 <div class="section">
89 <h2><a name="errorlog" id="errorlog">Error Log</a></h2>
90     
91
92     <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="./mod/core.html">core</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/core.html#errorlog">ErrorLog</a></code></li><li><code class="directive"><a href="./mod/core.html#errorlogformat">ErrorLogFormat</a></code></li><li><code class="directive"><a href="./mod/core.html#loglevel">LogLevel</a></code></li></ul></td></tr></table>
93
94     <p>The server error log, whose name and location is set by the
95     <code class="directive"><a href="./mod/core.html#errorlog">ErrorLog</a></code> directive, is the
96     most important log file. This is the place where Apache httpd
97     will send diagnostic information and record any errors that it
98     encounters in processing requests. It is the first place to
99     look when a problem occurs with starting the server or with the
100     operation of the server, since it will often contain details of
101     what went wrong and how to fix it.</p>
102
103     <p>The error log is usually written to a file (typically
104     <code>error_log</code> on Unix systems and
105     <code>error.log</code> on Windows and OS/2). On Unix systems it
106     is also possible to have the server send errors to
107     <code>syslog</code> or <a href="#piped">pipe them to a
108     program</a>.</p>
109
110     <p>The format of the error log is defined by the <code class="directive"><a href="./mod/core.html#errorlogformat">ErrorLogFormat</a></code> directive, with which you
111     can customize what values are logged. A default is format defined 
112     if you don't specify one. A typical log message follows:</p>
113
114     <div class="example"><p><code>
115     [Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416] 
116     [client 72.15.99.187] File does not exist: /usr/local/apache2/htdocs/favicon.ico
117     </code></p></div>
118
119     <p>The first item in the log entry is the date and time of the
120     message. The next is the module producing the message (core, in this
121     case) and the severity level of that message. This is followed by
122     the process ID and, if appropriate, the thread ID, of the process
123     that experienced the condition. Next, we have the client address
124     that made the request. And finally is the detailed error message,
125     which in this case indicates a request for a file that did not
126     exist.</p>
127
128     <p>A very wide variety of different messages can appear in the
129     error log. Most look similar to the example above. The error
130     log will also contain debugging output from CGI scripts. Any
131     information written to <code>stderr</code> by a CGI script will
132     be copied directly to the error log.</p>
133
134     <p>Putting a <code>%L</code> token in both the error log and the access
135     log will produce a log entry ID with which you can correlate the entry
136     in the error log with the entry in the access log. If
137     <code class="module"><a href="./mod/mod_unique_id.html">mod_unique_id</a></code> is loaded, its unique request ID will be
138     used as the log entry ID, too.</p>
139
140     <p>During testing, it is often useful to continuously monitor
141     the error log for any problems. On Unix systems, you can
142     accomplish this using:</p>
143
144     <div class="example"><p><code>
145       tail -f error_log
146     </code></p></div>
147   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
148 <div class="section">
149 <h2><a name="permodule" id="permodule">Per-module logging</a></h2>
150     
151
152     <p>The <code class="directive"><a href="./mod/core.html#loglevel">LogLevel</a></code> directive
153     allows you to specify a log severity level on a per-module basis. In
154     this way, if you are troubleshooting a problem with just one
155     particular module, you can turn up its logging volume without also
156     getting the details of other modules that you're not interested in.
157     This is particularly useful for modules such as
158     <code class="module"><a href="./mod/mod_proxy.html">mod_proxy</a></code> or <code class="module"><a href="./mod/mod_rewrite.html">mod_rewrite</a></code> where you
159     want to know details about what it's trying to do.</p>
160
161     <p>Do this by specifying the name of the module in your
162     <code class="directive">LogLevel</code> directive:</p>
163
164     <div class="example"><p><code>
165     LogLevel info rewrite:trace5
166     </code></p></div>
167
168     <p>This sets the main <code class="directive">LogLevel</code> to info, but
169     turns it up to <code>trace5</code> for
170     <code class="module"><a href="./mod/mod_rewrite.html">mod_rewrite</a></code>.</p>
171
172     <div class="note">This replaces the per-module logging directives, such as
173     <code>RewriteLog</code>, that were present in earlier versions of
174     the server.</div>
175   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
176 <div class="section">
177 <h2><a name="accesslog" id="accesslog">Access Log</a></h2>
178     
179
180     <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_log_config.html">mod_log_config</a></code></li><li><code class="module"><a href="./mod/mod_setenvif.html">mod_setenvif</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code></li><li><code class="directive"><a href="./mod/mod_log_config.html#logformat">LogFormat</a></code></li><li><code class="directive"><a href="./mod/mod_setenvif.html#setenvif">SetEnvIf</a></code></li></ul></td></tr></table>
181
182     <p>The server access log records all requests processed by the
183     server. The location and content of the access log are
184     controlled by the <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code>
185     directive. The <code class="directive"><a href="./mod/mod_log_config.html#logformat">LogFormat</a></code>
186     directive can be used to simplify the selection of 
187     the contents of the logs. This section describes how to configure the server
188     to record information in the access log.</p>
189
190     <p>Of course, storing the information in the access log is only
191     the start of log management. The next step is to analyze this
192     information to produce useful statistics. Log analysis in
193     general is beyond the scope of this document, and not really
194     part of the job of the web server itself. For more information
195     about this topic, and for applications which perform log
196     analysis, check the <a href="http://dmoz.org/Computers/Software/Internet/Site_Management/Log_analysis/">
197     Open Directory</a> or <a href="http://dir.yahoo.com/Computers_and_Internet/Software/Internet/World_Wide_Web/Servers/Log_Analysis_Tools/">
198     Yahoo</a>.</p>
199
200     <p>Various versions of Apache httpd have used other modules and
201     directives to control access logging, including
202     mod_log_referer, mod_log_agent, and the
203     <code>TransferLog</code> directive. The <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code> directive now subsumes
204     the functionality of all the older directives.</p>
205
206     <p>The format of the access log is highly configurable. The format
207     is specified using a format string that looks much like a C-style
208     printf(1) format string. Some examples are presented in the next
209     sections. For a complete list of the possible contents of the
210     format string, see the <code class="module"><a href="./mod/mod_log_config.html">mod_log_config</a></code> <a href="mod/mod_log_config.html#formats">format strings</a>.</p>
211
212     <h3><a name="common" id="common">Common Log Format</a></h3>
213       
214
215       <p>A typical configuration for the access log might look as
216       follows.</p>
217
218       <div class="example"><p><code>
219         LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common<br />
220          CustomLog logs/access_log common
221       </code></p></div>
222
223       <p>This defines the <em>nickname</em> <code>common</code> and
224       associates it with a particular log format string. The format
225       string consists of percent directives, each of which tell the
226       server to log a particular piece of information. Literal
227       characters may also be placed in the format string and will be
228       copied directly into the log output. The quote character
229       (<code>"</code>) must be escaped by placing a backslash before
230       it to prevent it from being interpreted as the end of the
231       format string. The format string may also contain the special
232       control characters "<code>\n</code>" for new-line and
233       "<code>\t</code>" for tab.</p>
234
235       <p>The <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code>
236       directive sets up a new log file using the defined
237       <em>nickname</em>. The filename for the access log is relative to
238       the <code class="directive"><a href="./mod/core.html#serverroot">ServerRoot</a></code> unless it
239       begins with a slash.</p>
240
241       <p>The above configuration will write log entries in a format
242       known as the Common Log Format (CLF). This standard format can
243       be produced by many different web servers and read by many log
244       analysis programs. The log file entries produced in CLF will
245       look something like this:</p>
246
247       <div class="example"><p><code>
248         127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
249         /apache_pb.gif HTTP/1.0" 200 2326
250       </code></p></div>
251
252       <p>Each part of this log entry is described below.</p>
253
254       <dl>
255         <dt><code>127.0.0.1</code> (<code>%h</code>)</dt>
256
257         <dd>This is the IP address of the client (remote host) which
258         made the request to the server. If <code class="directive"><a href="./mod/core.html#hostnamelookups">HostnameLookups</a></code> is
259         set to <code>On</code>, then the server will try to determine
260         the hostname and log it in place of the IP address. However,
261         this configuration is not recommended since it can
262         significantly slow the server. Instead, it is best to use a
263         log post-processor such as <code class="program"><a href="./programs/logresolve.html">logresolve</a></code> to determine
264         the hostnames. The IP address reported here is not
265         necessarily the address of the machine at which the user is
266         sitting. If a proxy server exists between the user and the
267         server, this address will be the address of the proxy, rather
268         than the originating machine.</dd>
269
270         <dt><code>-</code> (<code>%l</code>)</dt>
271
272         <dd>The "hyphen" in the output indicates that the requested
273         piece of information is not available. In this case, the
274         information that is not available is the RFC 1413 identity of
275         the client determined by <code>identd</code> on the clients
276         machine. This information is highly unreliable and should
277         almost never be used except on tightly controlled internal
278         networks. Apache httpd will not even attempt to determine
279         this information unless <code class="directive"><a href="./mod/core.html#identitycheck">IdentityCheck</a></code> is set
280         to <code>On</code>.</dd>
281
282         <dt><code>frank</code> (<code>%u</code>)</dt>
283
284         <dd>This is the userid of the person requesting the document
285         as determined by HTTP authentication. The same value is
286         typically provided to CGI scripts in the
287         <code>REMOTE_USER</code> environment variable. If the status
288         code for the request (see below) is 401, then this value
289         should not be trusted because the user is not yet
290         authenticated. If the document is not password protected,
291         this part will be "<code>-</code>" just like the previous
292         one.</dd>
293
294         <dt><code>[10/Oct/2000:13:55:36 -0700]</code>
295         (<code>%t</code>)</dt>
296
297         <dd>
298           The time that the request was received.
299           The format is: 
300
301           <p class="indent">
302             <code>[day/month/year:hour:minute:second zone]<br />
303              day = 2*digit<br />
304              month = 3*letter<br />
305              year = 4*digit<br />
306              hour = 2*digit<br />
307              minute = 2*digit<br />
308              second = 2*digit<br />
309              zone = (`+' | `-') 4*digit</code>
310           </p>
311           <p>It is possible to have the time displayed in another format
312           by specifying <code>%{format}t</code> in the log format
313           string, where <code>format</code> is either as in
314           <code>strftime(3)</code> from the C standard library,
315           or one of the supported special tokens. For details see
316           the <code class="module"><a href="./mod/mod_log_config.html">mod_log_config</a></code> <a href="mod/mod_log_config.html#formats">format strings</a>.</p>
317         </dd>
318
319         <dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
320         (<code>\"%r\"</code>)</dt>
321
322         <dd>The request line from the client is given in double
323         quotes. The request line contains a great deal of useful
324         information. First, the method used by the client is
325         <code>GET</code>. Second, the client requested the resource
326         <code>/apache_pb.gif</code>, and third, the client used the
327         protocol <code>HTTP/1.0</code>. It is also possible to log
328         one or more parts of the request line independently. For
329         example, the format string "<code>%m %U%q %H</code>" will log
330         the method, path, query-string, and protocol, resulting in
331         exactly the same output as "<code>%r</code>".</dd>
332
333         <dt><code>200</code> (<code>%&gt;s</code>)</dt>
334
335         <dd>This is the status code that the server sends back to the
336         client. This information is very valuable, because it reveals
337         whether the request resulted in a successful response (codes
338         beginning in 2), a redirection (codes beginning in 3), an
339         error caused by the client (codes beginning in 4), or an
340         error in the server (codes beginning in 5). The full list of
341         possible status codes can be found in the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.txt">HTTP
342         specification</a> (RFC2616 section 10).</dd>
343
344         <dt><code>2326</code> (<code>%b</code>)</dt>
345
346         <dd>The last part indicates the size of the object returned
347         to the client, not including the response headers. If no
348         content was returned to the client, this value will be
349         "<code>-</code>". To log "<code>0</code>" for no content, use
350         <code>%B</code> instead.</dd>
351       </dl>
352     
353
354     <h3><a name="combined" id="combined">Combined Log Format</a></h3>
355       
356
357       <p>Another commonly used format string is called the Combined
358       Log Format. It can be used as follows.</p>
359
360       <div class="example"><p><code>
361         LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\"
362         \"%{User-agent}i\"" combined<br />
363          CustomLog log/access_log combined
364       </code></p></div>
365
366       <p>This format is exactly the same as the Common Log Format,
367       with the addition of two more fields. Each of the additional
368       fields uses the percent-directive
369       <code>%{<em>header</em>}i</code>, where <em>header</em> can be
370       any HTTP request header. The access log under this format will
371       look like:</p>
372
373       <div class="example"><p><code>
374         127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
375         /apache_pb.gif HTTP/1.0" 200 2326
376         "http://www.example.com/start.html" "Mozilla/4.08 [en]
377         (Win98; I ;Nav)"
378       </code></p></div>
379
380       <p>The additional fields are:</p>
381
382       <dl>
383         <dt><code>"http://www.example.com/start.html"</code>
384         (<code>\"%{Referer}i\"</code>)</dt>
385
386         <dd>The "Referer" (sic) HTTP request header. This gives the
387         site that the client reports having been referred from. (This
388         should be the page that links to or includes
389         <code>/apache_pb.gif</code>).</dd>
390
391         <dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
392         (<code>\"%{User-agent}i\"</code>)</dt>
393
394         <dd>The User-Agent HTTP request header. This is the
395         identifying information that the client browser reports about
396         itself.</dd>
397       </dl>
398     
399
400     <h3><a name="multiple" id="multiple">Multiple Access Logs</a></h3>
401       
402
403       <p>Multiple access logs can be created simply by specifying
404       multiple <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code> 
405       directives in the configuration
406       file. For example, the following directives will create three
407       access logs. The first contains the basic CLF information,
408       while the second and third contain referer and browser
409       information. The last two <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code> lines show how
410       to mimic the effects of the <code>ReferLog</code> and <code>AgentLog</code> directives.</p>
411
412       <div class="example"><p><code>
413         LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common<br />
414         CustomLog logs/access_log common<br />
415         CustomLog logs/referer_log "%{Referer}i -&gt; %U"<br />
416         CustomLog logs/agent_log "%{User-agent}i"
417       </code></p></div>
418
419       <p>This example also shows that it is not necessary to define a
420       nickname with the <code class="directive"><a href="./mod/mod_log_config.html#logformat">LogFormat</a></code> directive. Instead,
421       the log format can be specified directly in the <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code> directive.</p>
422     
423
424     <h3><a name="conditional" id="conditional">Conditional Logs</a></h3>
425       
426
427       <p>There are times when it is convenient to exclude certain
428       entries from the access logs based on characteristics of the
429       client request. This is easily accomplished with the help of <a href="env.html">environment variables</a>. First, an
430       environment variable must be set to indicate that the request
431       meets certain conditions. This is usually accomplished with 
432       <code class="directive"><a href="./mod/mod_setenvif.html#setenvif">SetEnvIf</a></code>. Then the
433       <code>env=</code> clause of the <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code> directive is used to
434       include or exclude requests where the environment variable is
435       set. Some examples:</p>
436
437       <div class="example"><p><code>
438         # Mark requests from the loop-back interface<br />
439         SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog<br />
440         # Mark requests for the robots.txt file<br />
441         SetEnvIf Request_URI "^/robots\.txt$" dontlog<br />
442         # Log what remains<br />
443         CustomLog logs/access_log common env=!dontlog
444       </code></p></div>
445
446       <p>As another example, consider logging requests from
447       english-speakers to one log file, and non-english speakers to a
448       different log file.</p>
449
450       <div class="example"><p><code>
451         SetEnvIf Accept-Language "en" english<br />
452         CustomLog logs/english_log common env=english<br />
453         CustomLog logs/non_english_log common env=!english
454       </code></p></div>
455
456       <p>In a caching scenario one would want to know about
457       the efficiency of the cache. A very simple method to
458       find this out would be:</p>
459
460       <div class="example"><p><code>
461         SetEnv CACHE_MISS 1<br />
462         LogFormat "%h %l %u %t "%r " %&gt;s %b %{CACHE_MISS}e" common-cache<br />
463         CustomLog logs/access_log common-cache
464       </code></p></div>
465
466       <p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> will run before
467       <code class="module"><a href="./mod/mod_env.html">mod_env</a></code> and when successfull will deliver the
468       content without it. In that case a cache hit will log
469       <code>-</code>, while a cache miss will log <code>1</code>.</p>
470
471       <p>In addition to the <code>env=</code> syntax, <code class="directive"><a href="./mod/mod_log_config.html#logformat">LogFormat</a></code> supports logging values
472       conditional upon the HTTP response code:</p>
473
474       <div class="example"><p><code>
475       LogFormat "%400,501{User-agent}i" browserlog<br />
476       LogFormat "%!200,304,302{Referer}i" refererlog
477       </code></p></div>
478
479       <p>In the first example, the <code>User-agent</code> will be
480       logged if the HTTP status code is 400 or 501. In other cases, a
481       literal "-" will be logged instead. Likewise, in the second
482       example, the <code>Referer</code> will be logged if the HTTP
483       status code is <strong>not</strong> 200, 204, or 302. (Note the
484       "!" before the status codes.</p>
485
486       <p>Although we have just shown that conditional logging is very
487       powerful and flexible, it is not the only way to control the
488       contents of the logs. Log files are more useful when they
489       contain a complete record of server activity. It is often
490       easier to simply post-process the log files to remove requests
491       that you do not want to consider.</p>
492     
493   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
494 <div class="section">
495 <h2><a name="rotation" id="rotation">Log Rotation</a></h2>
496     
497
498     <p>On even a moderately busy server, the quantity of
499     information stored in the log files is very large. The access
500     log file typically grows 1 MB or more per 10,000 requests. It
501     will consequently be necessary to periodically rotate the log
502     files by moving or deleting the existing logs. This cannot be
503     done while the server is running, because Apache httpd will continue
504     writing to the old log file as long as it holds the file open.
505     Instead, the server must be <a href="stopping.html">restarted</a> after the log files are
506     moved or deleted so that it will open new log files.</p>
507
508     <p>By using a <em>graceful</em> restart, the server can be
509     instructed to open new log files without losing any existing or
510     pending connections from clients. However, in order to
511     accomplish this, the server must continue to write to the old
512     log files while it finishes serving old requests. It is
513     therefore necessary to wait for some time after the restart
514     before doing any processing on the log files. A typical
515     scenario that simply rotates the logs and compresses the old
516     logs to save space is:</p>
517
518     <div class="example"><p><code>
519       mv access_log access_log.old<br />
520       mv error_log error_log.old<br />
521       apachectl graceful<br />
522       sleep 600<br />
523       gzip access_log.old error_log.old
524     </code></p></div>
525
526     <p>Another way to perform log rotation is using <a href="#piped">piped logs</a> as discussed in the next
527     section.</p>
528   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
529 <div class="section">
530 <h2><a name="piped" id="piped">Piped Logs</a></h2>
531     
532
533     <p>Apache httpd is capable of writing error and access log
534     files through a pipe to another process, rather than directly
535     to a file. This capability dramatically increases the
536     flexibility of logging, without adding code to the main server.
537     In order to write logs to a pipe, simply replace the filename
538     with the pipe character "<code>|</code>", followed by the name
539     of the executable which should accept log entries on its
540     standard input. The server will start the piped-log process when
541     the server starts, and will restart it if it crashes while the
542     server is running. (This last feature is why we can refer to
543     this technique as "reliable piped logging".)</p>
544
545     <p>Piped log processes are spawned by the parent Apache httpd
546     process, and inherit the userid of that process. This means
547     that piped log programs usually run as root. It is therefore
548     very important to keep the programs simple and secure.</p>
549
550     <p>One important use of piped logs is to allow log rotation
551     without having to restart the server. The Apache HTTP Server
552     includes a simple program called <code class="program"><a href="./programs/rotatelogs.html">rotatelogs</a></code>
553     for this purpose. For example, to rotate the logs every 24 hours, you
554     can use:</p>
555
556     <div class="example"><p><code>
557       CustomLog "|/usr/local/apache/bin/rotatelogs
558       /var/log/access_log 86400" common
559     </code></p></div>
560
561     <p>Notice that quotes are used to enclose the entire command
562     that will be called for the pipe. Although these examples are
563     for the access log, the same technique can be used for the
564     error log.</p>
565
566     <p>A similar but much more flexible log rotation program
567     called <a href="http://www.cronolog.org/">cronolog</a>
568     is available at an external site.</p>
569
570     <p>As with conditional logging, piped logs are a very powerful
571     tool, but they should not be used where a simpler solution like
572     off-line post-processing is available.</p>
573
574     <p>By default the piped log process is spawned without invoking
575     a shell. Use "<code>|$</code>" instead of "<code>|</code>"
576     to spawn using a shell (usually with <code>/bin/sh -c</code>):</p>
577
578     <div class="example"><p><code>
579       # Invoke "rotatelogs" using a shell<br />
580       CustomLog "|$/usr/local/apache/bin/rotatelogs
581       /var/log/access_log 86400" common
582     </code></p></div>
583
584     <p>This was the default behaviour for Apache 2.2.
585     Depending on the shell specifics this might lead to
586     an additional shell process for the lifetime of the logging
587     pipe program and signal handling problems during restart.
588     For compatibility reasons with Apache 2.2 the notation
589     "<code>||</code>" is also supported and equivalent to using
590     "<code>|</code>".</p>
591   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
592 <div class="section">
593 <h2><a name="virtualhost" id="virtualhost">Virtual Hosts</a></h2>
594     
595
596     <p>When running a server with many <a href="vhosts/">virtual
597     hosts</a>, there are several options for dealing with log
598     files. First, it is possible to use logs exactly as in a
599     single-host server. Simply by placing the logging directives
600     outside the <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> sections in the
601     main server context, it is possible to log all requests in the
602     same access log and error log. This technique does not allow
603     for easy collection of statistics on individual virtual
604     hosts.</p>
605
606     <p>If <code class="directive"><a href="./mod/mod_log_config.html#customlog">CustomLog</a></code> 
607     or <code class="directive"><a href="./mod/core.html#errorlog">ErrorLog</a></code>
608     directives are placed inside a
609     <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>
610     section, all requests or errors for that virtual host will be
611     logged only to the specified file. Any virtual host which does
612     not have logging directives will still have its requests sent
613     to the main server logs. This technique is very useful for a
614     small number of virtual hosts, but if the number of hosts is
615     very large, it can be complicated to manage. In addition, it
616     can often create problems with <a href="vhosts/fd-limits.html">insufficient file
617     descriptors</a>.</p>
618
619     <p>For the access log, there is a very good compromise. By
620     adding information on the virtual host to the log format
621     string, it is possible to log all hosts to the same log, and
622     later split the log into individual files. For example,
623     consider the following directives.</p>
624
625     <div class="example"><p><code>
626       LogFormat "%v %l %u %t \"%r\" %&gt;s %b"
627       comonvhost<br />
628       CustomLog logs/access_log comonvhost
629     </code></p></div>
630
631     <p>The <code>%v</code> is used to log the name of the virtual
632     host that is serving the request. Then a program like <a href="programs/other.html">split-logfile</a> can be used to
633     post-process the access log in order to split it into one file
634     per virtual host.</p>
635   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
636 <div class="section">
637 <h2><a name="other" id="other">Other Log Files</a></h2>
638     
639
640     <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_logio.html">mod_logio</a></code></li><li><code class="module"><a href="./mod/mod_log_config.html">mod_log_config</a></code></li><li><code class="module"><a href="./mod/mod_log_forensic.html">mod_log_forensic</a></code></li><li><code class="module"><a href="./mod/mod_cgi.html">mod_cgi</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/mod_log_config.html#logformat">LogFormat</a></code></li><li><code class="directive"><a href="./mod/mod_log_config.html#bufferedlogs">BufferedLogs</a></code></li><li><code class="directive"><a href="./mod/mod_log_forensic.html#forensiclog">ForensicLog</a></code></li><li><code class="directive"><a href="./mod/mpm_common.html#pidfile">PidFile</a></code></li><li><code class="directive"><a href="./mod/mod_cgi.html#scriptlog">ScriptLog</a></code></li><li><code class="directive"><a href="./mod/mod_cgi.html#scriptlogbuffer">ScriptLogBuffer</a></code></li><li><code class="directive"><a href="./mod/mod_cgi.html#scriptloglength">ScriptLogLength</a></code></li></ul></td></tr></table>
641
642     <h3>Logging actual bytes sent and received</h3>
643       
644
645       <p><code class="module"><a href="./mod/mod_logio.html">mod_logio</a></code> adds in two additional
646          <code class="directive"><a href="./mod/mod_log_config.html#logformat">LogFormat</a></code> fields
647          (%I and %O) that log the actual number of bytes received and sent
648          on the network.</p>
649     
650
651     <h3>Forensic Logging</h3>
652       
653
654       <p><code class="module"><a href="./mod/mod_log_forensic.html">mod_log_forensic</a></code> provides for forensic logging of
655          client requests. Logging is done before and after processing a
656          request, so the forensic log contains two log lines for each
657          request. The forensic logger is very strict with no customizations.
658          It can be an invaluable debugging and security tool.</p>
659     
660
661     <h3><a name="pidfile" id="pidfile">PID File</a></h3>
662       
663
664       <p>On startup, Apache httpd saves the process id of the parent
665       httpd process to the file <code>logs/httpd.pid</code>. This
666       filename can be changed with the <code class="directive"><a href="./mod/mpm_common.html#pidfile">PidFile</a></code> directive. The
667       process-id is for use by the administrator in restarting and
668       terminating the daemon by sending signals to the parent
669       process; on Windows, use the -k command line option instead.
670       For more information see the <a href="stopping.html">Stopping
671       and Restarting</a> page.</p>    
672     
673
674     <h3><a name="scriptlog" id="scriptlog">Script Log</a></h3>
675       
676
677       <p>In order to aid in debugging, the
678       <code class="directive"><a href="./mod/mod_cgi.html#scriptlog">ScriptLog</a></code> directive
679       allows you to record the input to and output from CGI scripts.
680       This should only be used in testing - not for live servers.
681       More information is available in the <a href="mod/mod_cgi.html">mod_cgi</a> documentation.</p>
682     
683
684   </div></div>
685 <div class="bottomlang">
686 <p><span>Available Languages: </span><a href="./en/logs.html" title="English">&nbsp;en&nbsp;</a> |
687 <a href="./fr/logs.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
688 <a href="./ja/logs.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
689 <a href="./ko/logs.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
690 <a href="./tr/logs.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
691 </div><div id="footer">
692 <p class="apache">Copyright 2011 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
693 <p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p></div>
694 </body></html>