if (! (strstr("-", $token_array[2])) and (strlen($token_array[2]) > 1)) { $return_array['UserName'] = $token_array[2];
}
Хорошо было бы отделить дату от времени, потому что пока они хранятся вместе в переменной $token_array[3]. Это делает приведенное регулярное выражение. Оно находит все, что предшествует первому двоеточию и это будет дата. Затем оно находит все до следующего пробела, и это будет время.
Дата и время записываются в $dale_array[1 ] и $date_array[2] соответственно. Потом мы запишем их в нужное место переменной $return_array:
preg_match(7([Va-zA-Z0-9]+)[\: ]([0-9: ]+)/",
$token_array[3],$date_array); $return_array['Oate'] = $return_array['Time'] = $date_array[2];
Нижеприведенные строки помещают остальные данные в возвращаемый массив и возвращают из функции содержимое переменной $return_array:
$return_array['TimeZone'] = $to ken_a r ray[4]; $return_array['RequestMethod'] = $token_array[5]; $return_array['Resource'] = $token_array[6]; $return_array['HTTPVersion'] = $token_array[7]; $return_array['StatusCode'] = $token_array[8]; $return_array['BytesSent'] = $token_array[9]; return $return array;
}
Сценарий анализатора журнала
Теперь напишем остальную часть сценария. В нашем примере мы просто посчитаем количество вхождений кода состояния каждого типа и отправим результат администратору электронной почтой. При желании можно включить и другую статистику:
<?php
// Выполнять сценарий без ограничения времени
/* •-- Переменные, используемые в сценарии -- .*/
Slogfile = './access.log"; $admin_email = "admin@localhost";
function tokenizeLine(Sline) {
$line = preg_replace("/(\[|\]|\")/", "", $line); $token = strtok($line, " "); while ($token) {
$token_array[] ,= Stoken; =
>
$return_array['IP'] = $token_array[0];
if {! (strstr("-", $token_array[2])) and (strlen($token_array[2]) > 1)) { $return_array['llserName'] = $token_array[2];
}
preg_match("/([ya-zA-Z0-9]+)[\: ]([0-9:]+)/",
$token_array[3],$date_array); =
$return_array['Time'] = $date_array[2]; $return_array['TimeZone'] = $token_array[4];
$return_array['RequestMethod'] = $token_array[5]; $return_array['Resource'] = $token_array[6]; $return_array['HTTPVersion'] = $token_array[7]; $return_array['StatusCode'] = $token_array[8]; $return_array['BytesSent'] = $token_array[9]; return $reiurn_array;
}
Сценарий считывает каждую строку журнала в массив с именем $file_con- tents: