on 3/27/03 10:09 AM, Ronan Chilvers at [EMAIL PROTECTED] appended the
following bits to my mbox:

> However I have a little problem which someone might have come across or be
> able to shed some light on.  I want to pipe logs directly from apache into
> mysql.  At the moment I can do this using a perl script that does this sort of
> thing:-

Not sure if this helps you (or others on the list), but this is how I get
logs into MySQL, via direct piping to the command line client, no php or
perl involved:

In MySQL, I have the following table setup:

CREATE TABLE `access_log_archive` (
  `id` int(11) NOT NULL auto_increment,
  `remote_ip` varchar(15) NOT NULL default '',
  `remote_host` varchar(255) NOT NULL default '',
  `remote_domain` varchar(10) NOT NULL default '',
  `remote_log_name` varchar(20) NOT NULL default '',
  `remote_user` varchar(20) NOT NULL default '',
  `server_name` varchar(255) NOT NULL default '',
  `request_uri` varchar(255) NOT NULL default '',
  `request_date` datetime NOT NULL default '0000-00-00 00:00:00',
  `request_status` int(11) NOT NULL default '0',
  `request_bytes_sent` int(11) NOT NULL default '0',
  `request_content_type` varchar(50) NOT NULL default '',
  `request_referer` varchar(255) NOT NULL default '',
  `request_user_agent` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
 ) TYPE=MyISAM COMMENT='Apache Logging Table'

In the httpd.conf file, I have the following log format line:

LogFormat "INSERT INTO access_log
st_user_agent) VALUES
%{Referer}i','%{User-Agent}i');" mysql

On my devel machine, I just use one log for all vhosts,  so I have

CustomLog "|mysql -u apache -p{PASSWORD REMOVED} apache" mysql
CustomLog "/private/var/log/httpd/access_log" combined

On a production server with separate logs, I have the CustomLog command in
each vhost.

You still need to log to a file as well, just in case the MySQL server isn't
available.  Apache doesn't like it when it can't write it's log files.  Bad
things might happen.

Using the above, apache seamlessly logs the request data to the MySQL table.

I'm currently working on a nice front end query tool.  Any query help would
be welcome.  :-)

This gives the top servers in order of hits:

select count(*) as hits,server_name from access_log_archive group by
server_name order by hits desc;

Note: If your server is busy, you should query from another "mirrored" table
that isn't being accessed all the time.  If not, you get index corruption
that shows up in things like this:

ERROR 1030: Got error 127 from table handler

You could also add indexes for that table to speed up queries and setup a
script to automatically migrate from one table to the other, etc.

Hope that helps. YMMV. TMTOWTDI.


Paul Burney

    while ($self != "asleep") {

PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to