Привет я пытаюсь рассчитать процент неудачных запросов.
предполагая только 200 и 404 коды ошибок,
Пока что я планирую извлечь IP-адрес и код ошибки и поместить их в массив.
есть ли лучший способ сделать это, чем подход, который я выбрал
Sample access log content:
<pre>
192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /try/ HTTP/1.0" 200 3395
127.0.0.1 - - [28/Jul/2006:10:22:04 -0300] "GET / HTTP/1.0" 200 2216
127.0.0.1 - - [28/Jul/2006:10:27:32 -0300] "GET /hidden/ HTTP/1.0" 404 7218
</pre>
and trying to output array as below
Пример:
массив (
«127.0.0.1» => 0,5,
«192.168.2.20» => 0,
)
function analyzeAccessLog($fileName)
{
//$fh = fopen($fileName,'r')
$people = file_get_contents($fileName);
if (preg_match('/\200|404?\w/',$people,$matches)) {
{
$int1=$matches[0];
print "$int1 \n";
}
}
}
analyzeAccessLog('log.txt');
Вот что я придумал. Позволяет указать код состояния, процент которого вы хотите. Ваш вопрос был о процентах, но вы также упомянули о сохранении IP-адресов, поэтому эта функция сохраняет IP вместе с его кодом состояния в массивах (в соответствии с их индексным номером), чтобы вы могли делать то, что вы хотите, с данными, хранящимися там (определить процент статуса на IP и т. д.).
function analyzeAccessLog($fileName,$status = '404'){
$lines = file($fileName);
$i = 0;
$s = 0;
foreach ($lines as $line) {
//Get the IP
$ip = array();
$ip = explode('-',$line);
$data['ip'][$i] = trim($ip[0]);
//Get the status code.
$code = array();
$code = array_map('strrev', explode(' ', strrev($line)));
$data['code'][$i] = trim($code[1]);
if($code[1] == $status){
$s++;
}
$i++;
}
$percentage = round((($s/$i)*100),2).'% status code '.$status;
return $percentage;
}
$data = analyzeAccessLog('file.txt');
echo($data);
Других решений пока нет …