Skip to content

Instantly share code, notes, and snippets.

@sunbacon
Created October 2, 2020 06:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sunbacon/a4251d28921cd85c6e1ed40094e6987e to your computer and use it in GitHub Desktop.
Save sunbacon/a4251d28921cd85c6e1ed40094e6987e to your computer and use it in GitHub Desktop.
TLSV形式のアクセスログを解析する
<?php
$filePath = "access.log";
// 閾値以下のリクエストは無視する
$countThreshold = 100;
// count | sum_time | avg | req
$sortKey = "count";
// クエリストリング以降を合算する
$sumQueryString = true;
if (isset($argv[1])) {
$filePath = $argv[1];
}
if (file_exists($filePath)) {
if ($fp = fopen($filePath, 'r')) {
$logs = [];
while ($line = fgets($fp)) {
$items = explode("\t", $line);
$kvs = [];
foreach ($items as $item) {
$kv = explode(":", $item);
$key = $kv[0];
$value = $kv[1];
$kvs[$key] = $value;
}
// URLだけ取り出す
$reqStrings = explode(' ', $kvs['req']);
if (count($reqStrings) < 2) {
// たまに、不正フォーマットがある
continue;
}
$req = $reqStrings[1];
if ($sumQueryString && strpos($req, '?') !== false) {
$req = explode('?', $req)[0];
}
if (!isset($logs[$req])) {
$logs[$req] = [
'count' => 0,
'sum_time' => 0
];
}
$logs[$req]['count']++;
$logs[$req]['sum_time'] += $kvs['taken_sec'];
}
$rows = [];
foreach ($logs as $reqLog => $log) {
$count = $log['count'];
$sumTime = $log['sum_time'];
$avgTime = $log['sum_time'] / $count;
$row = [
'req' => $reqLog,
'sum_time' => $sumTime,
'count' => $count,
'avg' => $avgTime
];
$rows[] = $row;
}
// ソート
usort($rows, function ($a, $b) use ($sortKey) {
return $b[$sortKey] - $a[$sortKey];
});
foreach ($rows as $row) {
if ($row['count'] < $countThreshold) {
continue;
}
echo "req:" . $row['req'] . " ";
echo "sum_time:" . $row['sum_time'] . " ";
echo "count:" . $row['count'] . " ";
echo "avg::" . $row['avg'] . " ";
echo "\n";
}
} else {
echo "can not open file";
}
} else {
echo "file does not exists";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment