Скрипт парсинга лог файла на php.

Системное администрирование

Теги: ,

Понадобилось как то мне изучить один лог файл такого вида.

1235681402.549 60 192.168.3.178 TCP_MISS/200 1893 GET http://cs56.vkontakte.ru/u913861/c_cd95200a.jpg — DIRECT/93.186.224.56 image/jpeg
1235681402.568 28 192.168.3.178 TCP_MISS/200 1768 GET http://cs538.vkontakte.ru/u734614/c_c39c4cb0.jpg — DIRECT/93.186.227.48 image/jpeg
1235681402.646 98 192.168.3.178 TCP_MISS/200 2506 GET http://cs172.vkontakte.ru/u939545/c_4fcb27dc.jpg — DIRECT/93.186.225.22 image/jpeg
1235681402.704 69 192.168.3.178 TCP_MISS/200 1832 GET http://cs10.vkontakte.ru/u414810/c_502e4ee.jpg — DIRECT/93.186.224.10 image/jpeg
1235681402.945 123 192.168.3.178 TCP_MISS/200 10644 GET http://cs39.vkontakte.ru/g205031/a_e685a74.jpg — DIRECT/93.186.224.39 image/jpeg
1235681403.156 42 192.168.3.178 TCP_MISS/200 362 GET http://counter.yadro.ru/hit? — DIRECT/88.212.196.77 image/gif
1235681403.202 102 192.168.3.178 TCP_MISS/302 794 GET http://ad.adriver.ru/cgi-bin/erle.cgi? — DIRECT/81.222.128.22 text/html
1235681403.222 67 192.168.3.178 TCP_MISS/200 2794 GET http://cs676.vkontakte.ru/u991778/c_9b855214.jpg — DIRECT/93.186.226.146 image/jpeg
1235681403.235 53 192.168.3.178 TCP_MISS/200 2817 GET http://cs4146.vkontakte.ru/u238362/c_bf859673.jpg — DIRECT/93.186.239.50 image/jpeg

Это логи файл с прокси провайдера трафика одного пользователя. Первый столбик время, второй — время загрузка файла в миллисекундах, третий — ip пользователя, четвёртый — я не знаю, пятый размер скаченного файла, потом GET, седьмой адрес скаченного файла и ещё что-то непонятное. Надо было мне посмотреть всё правильно ли посчитано и вообще что к чему. Так как таких строчек было около 8000 я решил написать скрипт который разобрал бы этот файл и записал его в базу данных. Писать я решил на PHP а базу данных на mySQL.

Первое что я решил сделать привести файл в более удобный вид: я заменил все разделители на « » один пробел. То есть в обычном блокноте заменил все знак «-» на « » и несколько раз прогнал замену символов « »(два пробела) на « »(один пробел). Всё у меня получился отличный файл для разбора.

А вот и код скрипта:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$db_host = "localhost";
$db_user = "root";
$db_password = "pass";
$db_name = "logs";
 
$connection = mysql_connect ($db_host, $db_user, $db_password) or die ("error connectio");
mysql_select_db($db_name, $connection) or die (mysql_error());
 
$file_name = "log";
 
$array=file($file_name);
foreach ($array as $stroka)
{
$slovo = explode(" ",$stroka);
$newtime = date("Y:m:d:H:i:s",$slovo[0]);
$query = "Insert into logs2 values('$newtime',$slovo[1],'$slovo[2]','$slovo[3]',$slovo[4],'$slovo[5]','$slovo[6]','$slovo[7]','$slovo[8]')";
mysql_query ($query, $connection);
}
 
?>

Комментарии к коду для полых новичков:
Вначале задаём параметры для подключения к базе данных и коннектимся к ней.
$file_name = “log” имя лог файла он лежит в той же папке где и сам скрипт.
Команда $array=file($file_name); построчно считывает файл в массив $array.
Команда foreach ($array as $stroka) перебирает все элементы массива $array выполняет то, что находится в фигурных скобках, теперь каждый элемент массива $array переименован в $stroka и в ей хранится одна строчка лог файла.
Команда $slovo = explode(” “,$stroka); разбирает строчку на слова используя разделитель « »(пробел).
Команда $newtime = date(”Y:m:d:H:i:s”,$slovo[0]); приводит дату в нормальный вид.
Ну и записываем всё в базу данных.

База данных создаётся такой строчкой.

CREATE TABLE logs2 (time datetime, ms int(11), ip_to char(15), tcp char(20), size int(11), get char(10), adr varchar(100), ip_from varchar(20), obj varchar(20));

В принципе, скрипт получился довольно универсальный для решения простых задач. Может кому понадобится.

https://fotostrana.ru Знакомства для взрослых в Черемхово.

Похожие посты.

  1. Conky в Ubuntu
  2. Cron в Ubuntu. + bash-cкрипт резервного копирования.
  3. Решение ошибки при установки WordPress
  4. Настройка сети в Ubuntu через консоль, скрипт автоматической настройки сети.