如何解析日志文件并将数据加载到数据库中
问题描述:
如何解析文本文件以提取包括日期在内的数据并将其加载到我的数据库表中data_table
?如何解析日志文件并将数据加载到数据库中
这是我的文本文档log.txt
:
127.0.0.1 1.255.255.255 - - [30/Sep/2014:23:58:33 +0200] GET http://www.google.com HTTP/1.1 200 u:123456789 ourl:http://google.com/image ac:text ssl:1
127.0.0.1 1.255.255.255 - - [30/Sep/2014:23:58:33 +0200] GET http://www.google.com HTTP/1.1 200 u:123456789 new_data ourl:http://google.com/image ac:text ssl:1
...
这两条线都非常相似,但在第二行是新价值new_data
在我的数据库表中这些列:
|IP_1|IP_2|date_time|URL|HTTP_version|port|USER_ID|new_data|OURL|ac|ssl|
SQL代码:
Load data local infile 'D:/log.txt' into table `data_table` fields terminated by ' ' lines terminated by '\n'
如何从文本文件中解析'-','-','+0200','GET'
?如果我在行中没有值(最好的解决方案应该填充NULL),我应该如何填写new_data
列?
如果你能给我一些想法,我会非常感激。也可以是PHP脚本。
答
因为你加入PHP的标志,在这里我提出一个PHP的解决方案:
$line = "127.0.0.1 1.255.255.255 - - [30/Sep/2014:23:58:33 +0200] GET http://www.google.com HTTP/1.1 200 u:123456789 new_data ourl:http://google.com/image ac:text ssl:1";
if(preg_match('/^([^\\s]+)\\s([^\\s]+)\\s\\-\\s\\-\\s\\[([^\\]]+)\\]\\s[A-Z]+\\s([^\\s]+)\\s([^\\s]+)\\s([^\\s]+)\\su:([^\\s]+)\\s([^\\s]+)\\sourl:([^\\s]+)\\sac:([^\\s]+)\\sssl:([^\\s]+)/',$line,$m))
{
$v= array();
$v['IP_1']=$m[1];
$v['IP_2']=$m[2];
$v['date_time']=$m[3];
$v['URL']=$m[4];
$v['HTTP_version']=$m[5];
$v['HTTPcode']=$m[6];
$v['USER_ID']=$m[7];
$v['new_data']=$m[8];
$v['OURL']=$m[9];
$v['ac']=$m[10];
$v['ssl']=$m[11];
print_r($v);
}
注:这不是端口,但HTTP返回代码那边。
您可以了解更多关于PCRE上的文件http://php.net/manual/en/book.pcre.php
答
首先,file_get_contents()
并保存其内容的变量,然后explode()
它\r\n
。现在你可以循环这些内容,如下所示:
// ... inside the loop:
// $log = $allLines[$i] where $i is an iterator.
// Example log value: Client IP - - [31/Aug/2017:05:48:10 +0400] "GET/HTTP/1.1" 200 1020 "http://website.com/dir" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
$parser = explode('"', $log);
$ip = explode(" - - ", $parser[0]);
$ip = $ip[0];
$info = $parser[1];
$location = $parser[3];
$browser = $parser[5];
echo "<tr>
<td>IP</td>
<td>Info</td>
<td>Location</td>
<td>Browser</td>
</tr>
<tr>
<td>$ip</td>
<td>$info</td>
<td>$location</td>
<td>$browser</td>
</tr>";