实现自己的IT技术并不难。当事件发生时,比如:tracker.gif?action=create&what=sth
, tracker.gif?action=error&what=k_is_undefined
等,您只需向服务器发送请求即可。
然后解析服务器日志以获取统计信息(或通过tracker.php?action=create&what=sth
将请求直接发送到数据库)。
由于您控制着网站,因此现在很容易在用户登录或Ajax请求失败时进行这些请求。
对于错误处理,您可以使用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");
注意:在Safari浏览器中,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
}
}