]> granicus.if.org Git - apache/commitdiff
Added configuration example, code example, and a little explanation, to
authorRich Bowen <rbowen@apache.org>
Sat, 15 Jun 2002 20:09:08 +0000 (20:09 +0000)
committerRich Bowen <rbowen@apache.org>
Sat, 15 Jun 2002 20:09:08 +0000 (20:09 +0000)
facilitate logging all of your virtual hosts to a single file, and then
splitting them back up after. Note that if Apache has problems with this
many file handles, Perl might also. I'm not sure.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@95701 13f79535-47bb-0310-9956-ffa450edef68

docs/manual/vhosts/fd-limits.html.en

index dc09fb2d57b21c360ffaaca6249c74f69962c6a5..d7ba36af4bee5d813f1038a63052b69999353faa 100644 (file)
@@ -17,7 +17,7 @@
 
     <p>When using a large number of Virtual Hosts, Apache may run
     out of available file descriptors (sometimes called <cite>file
-    handles</cite> if each Virtual Host specifies different log
+    handles</cite>) if each Virtual Host specifies different log
     files. The total number of file descriptors used by Apache is
     one for each distinct error log file, one for every other log
     file directive, plus 10-20 for internal use. Unix operating
     this may not work if:</p>
 
     <ol>
-      <li>Your system does not provide the setrlimit() system
-      call.</li>
+      <li>Your system does not provide the <code>setrlimit()</code>
+      system call.</li>
 
-      <li>The setrlimit(RLIMIT_NOFILE) call does not function on
-      your system (such as Solaris 2.3)</li>
+      <li>The <code>setrlimit(RLIMIT_NOFILE)</code> call does not 
+      function on your system (such as Solaris 2.3)</li>
 
       <li>The number of file descriptors required exceeds the hard
       limit.</li>
 
     <ul>
       <li>Reduce the number of log files; don't specify log files
-      in the VirtualHost sections, but only log to the main log
-      files.</li>
+      in the <code><a 
+      href="../mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> 
+      sections, but only log to the main log files. (See <a
+      href="#splitlogs">Splitting up your log files</a>, below, for more
+      information on doing this.)</li>
 
       <li>
         If you system falls into 1 or 2 (above), then increase the
     document containing further details about file descriptor
     problems and how they can be solved on your operating
     system.</p>
+
+<h2><a name="splitlogs">Splitting up your log files</a></h2>
+
+<p>If you want to log multiple virtual hosts to the same log file, you
+may want to split up the log files afterwards in order to run
+statistical analysis of the various virtual hosts. This can be
+accomplished in the following manner.</p>
+
+<p>First, you will need to add the virtual host information to the log
+entries. This can be done using the <code><a
+href="../mod/mod_log_config.html#logformat">LogFormat</a></code>
+directive, and the <code>%v</code> variable. Add this to the beginning
+of your log format string:</p>
+
+<blockquote><table cellpadding="10"><tr><td bgcolor="#eeeeee"><code>
+ LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost<br>
+ CustomLog logs/multiple_vhost_log vhost
+</code></td></tr></table></blockquote>
+
+<p>This will create a log file in the common log format, but with the
+canonical virtual host (whatever appears in the
+../mod/core.html#servername">ServerName</a> directive) prepended to
+each line. (See <a 
+href="../mod/mod_log_config.html#formats">Custom Log Formats</a> for
+more about customizing your log files.)</p>
+
+<p>When you wish to split your log file into its component parts (one
+file per virtual host) you can use a program like the following to
+accomplish this:</p>
+
+<blockquote><table cellpadding="10"><tr><td bgcolor="#eeeeee"><pre>
+#!/usr/bin/perl
+# Filename: split_log
+# Usage: split_log multiple_vhost_log
+# Creates one log file per virtual host
+
+use strict;
+my $file = $ARGV[0]; # Name of the log file
+my %fh; # File handles
+
+# Read the log file, one line at a time
+open LOG, $file;
+foreach my $line (&lt;LOG&gt;) {
+    $line =~ s/^(.*?) //;
+
+    # Do we already have a file handle for this vhost?
+    unless ($fh{$1})    {
+        my $handle;
+        open ($handle, '&gt;' , $1 . '_split');
+        $fh{$1} = $handle;
+    }
+
+    # Write out the log entry
+    select ($fh{$1});
+    print $line;
+}
+close LOG;
+
+# Close all the open file handles
+foreach my $h ( keys %fh ) {
+    close $h;
+}
+</pre></td></tr></table></blockquote>
+
+<p>This program, when run with the name of your vhost log file, will
+generate one file for each virtual host that appears in your log file.
+Each file will be called <code>hostname_split</code>.</p>
+
     <!--#include virtual="footer.html" -->
   </body>
 </html>