Код писал давно, возможно можно улучшить и оптимизировать, но лень было пока этим заниматься, работает, что мне надо исполняет :)
Сначала в отдельный файл лучше скинуть несколько вспомогательных функций, чтобы не нагромождать код. Например, functools.php
<?php
function finder($string, $substring) {
$pos = stripos($string, $substring);
if ($pos === false) {
return false;
} else {
return true;
}
}
function cut_rows($data) {
$result = array();
foreach ($data as $str) {
$row = array();
$str = explode(" ", $str);
$concat = false;
$temp = "";
foreach($str as $substr) {
if ((finder($substr, "[")) && (!finder($substr, "]"))) {
$temp = $substr;
$concat = true;
} else if ((finder($substr, "]")) && ($concat == true)) {
$temp .= " ".$substr;
$row[] = $temp;
$concat = false;
} else if (finder($substr, "\"")) {
$pos1 = stripos($substr, "\"", 0);
$pos2 = stripos($substr, "\"", ($pos1 + 1));
if (!($pos1 === false) && ($pos2 === false) && ($concat == false)) {
$temp = $substr;
$concat = true;
} else if (!($pos1 === false) && ($pos2 === false) && ($concat == true)) {
$temp .= " ".$substr;
$row[] = $temp;
$concat = false;
} else {
$row[] = $substr;
}
} else if ($concat == true) {
$temp .= " ".$substr;
} else {
$row[] = $substr;
}
}
$result[] = $row;
}
return $result;
}
?>
Теперь можно написать сам скрипт, который можно назначить на исполнение в cron, например runner.php
<?php
include('functools.php ');
$data = file_get_contents("тут_путь_к_файлу_лога/access.log");
$data = explode("\n", $data);
array_pop($data);
$data = cut_rows($data);
// на данном этапе мы имеем массив строк, разбитый по колонкам
// содержание запросов получается в колонке 4
// у меня выбиралась статистика, поэтому готовой функции поиска запросов 404 я не делал, но думаю не составит труда составить подобную функцию
// напомню, запрос будет в 4-м элементе данного массива $data
// делаете перебор по нему и проверяете на необходимое вам
// когда находите необходимый запрос - можно получить дополнительные данные следующие:
// IP? с которого был запрос в элементе под индексом 0
// дату можно получить под индексом 3? но она для всех данных в файле одинаковая, поэтому можно например так:
$date = substr($data[0][3], 1, 11);
// с 1 по 10 включительно символ - это именно дата: день, месяц и год
// если надо время - оно в этой же строке, индексы вроде с 12 по 19 включительно, формат часы:минуты:секунды
// но у каждого запроса оно свое. Тогда можно как-то так сделать:
$time = substr($data[index][3], 12, 20);
// ну а дальше подключение к БД и запись того что нужно, зависит от вашей структуры БД
?>