It is not so difficult to implement your own . You simply send a request to the server when an event occurs: tracker.gif?action=create&what=sth, tracker.gif?action=error&what=k_is_undefinedetc.
You will then analyze the server logs for statistics. (or you send your request directly to the database tracker.php?action=create&what=sth)
Since you are managing the site, it is now easy to execute these requests when a user logs in or the ajax request fails.
For error handling you can use window.onerror:
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;
}
window.onerror = function(errorMessage, url, line) {
fireEvent("error", errorMessage, {
url: url,
line: line
});
return true;
};
fireEvent("ajaxError", "XY page failed to load");
(note: window.onerrornot available on safari)
UPDATE
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);
$length = $end_pos - $start_pos;
$req = substr($req, $start_pos+1, $length);
$exprs = explode("&", $req);
echo $i . ".<br>";
$i += 1;
foreach ($exprs as $expr) {
list($name, $value) = explode("=", $expr);
echo $name . " =>" . $value . "<br>";
}
}