将Apache日志文件放入MySQL表
可以将Apache设置为记录各种信息。从Apache2.2开始,全新安装的Apache将产生的基本日志文件格式将具有以下格式:
%h%l%u%t"%r"%>s%b
对于初学者而言,这并不意味着什么,所以这里是对每种方法的简短说明。
%h-远程主机。这是连接到服务器的用户的IP地址。
%l-远程日志名称。这并不总是存在。
%u-来自auth的远程用户(如果不使用身份验证,则什么也没有)。
%t-以通用日志格式显示的时间。
“%r”-请求的第一行,基本上是所使用的方法(GET/POST)和所访问的URL,以及所使用的HTTP协议级别。这用引号引起来。
%>s-%s返回原始请求请求的状态。对于某些请求,Apache将在内部创建一个辅助请求,因此%>s打印出最后一个请求状态。
%b-这是传输给用户的字节数。
这将产生以下整理输出。
127.0.0.1--[17/Apr/2009:14:12:20+0100]"GET/HTTP/1.1"200515
可以使用LOADDATA命令将该信息转换为数据库格式。首先,让我们创建需要存储此日志格式的表。
DROP TABLE IF EXISTS `test`.`apachelog`; CREATE TABLE `test`.`apachelog` ( `remote_host` VARCHAR(17) DEFAULT NULL, `remote_logname` VARCHAR(45) DEFAULT NULL, `remote_user` VARCHAR(45) DEFAULT NULL, `time1` VARCHAR(22) DEFAULT NULL, `time2` VARCHAR(7) DEFAULT NULL, `first_line_of_request` text, `last_request_status` VARCHAR(4) DEFAULT NULL, `bytes_sent` VARCHAR(10) DEFAULT NULL )
这是用于将日志文件转换为该表的命令。
LOAD DATA INFILE 'C:/Program Files/Apache Software Foundation/Apache2.2/logs/access.log' INTO TABLE apachelog FIELDS TERMINATED BY ' ' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES TERMINATED BY 'rn';
请注意,我们的表包含两个时间字段。这是由于两个因素。首先是每个字段都由一个空格定义,并且由于时间值包含一个空格,因此将其分为两个字段。第二个是尽管我们说OPTIONALLYENCLOSEDBY'“'来阻止%r输出被拆分,但是我们不能给LOADDATA命令多个这些字段中的一个,因此将时间拆分为两个字段,因此我们只创建了一个表,其中有多个字段可以容纳该字段。
为了改善表格,我们可以使用不同的输出格式。对我们的日志文件格式进行以下细微改动。
LogFormat"%h,%l,%u,%t,"%r",%>s,%b"
http.conf如果已设置虚拟主机,则可以在文件或httpd-vhosts.conf中找到此行。
这将导致我们的输出如下所示:
127.0.0.1,-,-,[20/Apr/2009:14:42:01+0100],"GET/HTTP/1.1",200,515
现在,我们可以将两个时间列更改为一个时间列,将数据类型设置为VARCHAR(30)并使用以下LOADDATA语法加载数据。
LOAD DATA INFILE 'C:/Program Files/Apache Software Foundation/Apache2.2/logs/access.log' INTO TABLE apachelog FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES TERMINATED BY 'rn';
这为我们的表提供了更好的数据集。
您还可以使用以下三个MySQL命令将旧表格式转换为新表格式。
ALTER TABLE apachelog CHANGE time1 TIME VARCHAR(40); UPDATE apachelog SET TIME = CONCAT(TIME,' ',time2); ALTER TABLE apachelog DROP COLUMN time2;
现在time2列将不再存在。