Это не так сложно реализовать свой .Вы просто отправляете запрос на сервер , когда происходит событие вроде: tracker.gif?action=create&what=sth
, tracker.gif?action=error&what=k_is_undefined
и т. Д.
Затем вы анализируете журналы сервера для получения статистики,(или вы отправляете свой запрос прямо в базу данных по tracker.php?action=create&what=sth
)
Поскольку вы контролируете сайт, теперь легко выполнять эти запросы, когда пользователь входит в систему, или запрос ajax не выполняется.
Для обработки ошибок вы можете использовать window.onerror
:
// send a request about an event to the server
function fireEvent(action, message, options) {
var loggerUrl = "/tracker.gif", parameters;
options = options || {};
options.url = options.url || window.location.href;
options.user_agent = navigator.userAgent;
options.message = message;
for (var i in options) {
if (options.hasOwnProperty(i)) {
parameters += "&" + i + "=" + encodeURIComponent(options[i]);
}
}
new Image().src = loggerUrl + parameters;
}
// log script errors
window.onerror = function(errorMessage, url, line) {
fireEvent("error", errorMessage, {
url: url,
line: line
});
return true;
};
// example event on the page
fireEvent("ajaxError", "XY page failed to load");
(примечание: window.onerror
недоступно в сафари)
ОБНОВЛЕНИЕ
А вот и подтверждение концепции парсера PHP:
$i = 1;
$d = file_get_contents("log.txt");
$requests = explode("\n", $d);
foreach ($requests as $req) {
$pos = strpos($req, "tracker.gif");
if ($pos === false) continue;
$start_pos = strpos($req, "?", $pos);
$end_pos = strpos($req, " ", $start_pos); // can also be " HTTP"
$length = $end_pos - $start_pos;
$req = substr($req, $start_pos+1, $length);
$exprs = explode("&", $req);
echo $i . ".<br>"; // request number
$i += 1;
foreach ($exprs as $expr) {
list($name, $value) = explode("=", $expr);
echo $name . " =>" . $value . "<br>"; // key => value
}
}