统计上报---日志上报成功率高的方式
1、使用图片信标
这项技术非常类似动态脚本注入. 使用JavaScript创建一个新的Image对象, 并把src属性设置为服务器上的脚本URL. 该URL包含了我们要通过GET传回的键值对数据. 请注意并没有创建img元素或把它插入DOM.
1
2
3
4
5
|
var url = '/status_tracker.php' ; var params = [
'step=2' ,
'time=1248027314'
]
( new Image()).src = url + '?' + params.join( '&' );
|
服务器会接收到数据并保存下来, 它无需向客户端发送任何回馈消息, 因此没有图片会实际显示出来. 这是给服务器回传信息最有效的方式. 它的性能消耗很小, 并且服务端的错误完全不会影响到客户端.
图片信标很简单, 但也意味着它能做的事情是有限的. 你无法发送POST数据, 而URL的长度有最大值, 所以你可以发送的数据的长度被限制得相当小. 你可以接收服务器返回的数据, 但只局限于非常少的几种方式. 一种方式是监听Image
对象的load
事件, 它会告诉你服务器是否成功接收数据. 你还可以检查服务器返回的图片的宽度和高度(如果是图片的话)并使用这些数字通知你服务器的状态. 举个例子, 宽度为1表示”成功”, 为2表示”重试”.
如果你不需要在响应中返回数据, 就应该发送一个不带消息正文的204 No Content状态码, 它将阻止客户端继续等待永远不会到来的消息正文.
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var url = '/status_tracker.php' ; var params = [
'step=2' ,
'time=1248027314'
]
var beacon = new Image();
beacon.src = url + '?' + params.join( '&' );
beacon.onload = function ( ) {
if ( this .width == 1) { //成功
} else if ( this .width == 2) { //失败
}
}
beacon.onerror = function () {
//出错
}
|
2. navigator.sendBeacon
js sendBeacon
页面性能日志:
DNS解析耗时 TCP链接耗时 SSL安全链接耗时 网络请求耗时 DOM解析耗时 资源加载耗时 首包时间 白屏时间 首次可交换时间 Dom Ready时间 页面完全加载时间。
如某些统计系统,在页面unload时,如果要上报当前数据,采用xhr的同步上报方式,会阻塞当前页面的跳转;使用new Image有可能遇到aborted,导致无法成功发送。
现在好了,可以使用浏览器来提供发送保障的更简洁的sendBeacon方法。sendBeacon是异步的,不会影响当前页到下一个页面的跳转速度,且不受同域限制。
window.addEventListener('unload', logData, false);function logData() {navigator.sendBeacon("/log", analyticsData);
}复制代码
sendBeacon 如果成功进入浏览器的发送队列后,会返回true;如果受到队列总数、数据大小的限制后,会返回false。返回ture后,只是表示进入了发送队列,浏览器会尽力保证发送成功,但是否成功了,不会再有任何返回值。目前暂无具体的数据长度限制标准。
考虑到对目前浏览器的支持情况,需要做一下降级支持(如同步模式下的xhr,如果不是同域则要支持CORS):
navigator.sendBeacon || new Function('var xhr=new XMLHttpRequest();xhr.open("POST",arguments[0],true);r.send(arguments[1]);');复制代码
当前浏览器对sendBeacon的支持情况(最新进展见:caniuse.com/#search=sen…):
- Chrome 37+
- Firefox (Gecko) 31+
- Internet Explorer 不支持
- Opera 24+
- Safari 不支持
- 手机端常用浏览器不支持
:Android浏览器支持了,但是iOS尚无支持
Google Analytics已经使用了navigator.sendBeacon()来上报数据:www.thyngster.com/google-anal…
3、IE8下的跨域共享
XDomainRequest 是代表javascript和Ajax的跨域请求
IE8+可使用XDomainRequest进行跨域请求
Members组成
XDomainRequest包含以下几部分:
1.事件
2.方法
3.属性
Events事件
1)onerror事件:完成跨域请求过程中发生错误时,会被激发
2)onload事件:成功请求完毕,返回对象时,会被激发
3)onprogress事件:浏览器开始从服务器端接收数据时,会被激发
4)ontimeout事件:超时会被激发
Methods方法
1)abort方法:终止等待send
2)open(XDomainRequest)方法:建立与服务器的链接
3)send(XDomainRequest)方法:传输一个字符窜数据给服务器来进行处理
Properties属性
1)constructor属性:返回一个对象的构造函数的引用
2)contentType属性:返回html请求或者返回的头部的content-type属性
3)responseText属性:以字符窜形式返回请求的body内容
4)timeout属性:超时返回的值
Usage用法
//创建一个对象
var xdr = new XDomainRequest();复制代码
//以get的方式建立链接
xdr.open("get", "http://www.contoso.com/xdr.aspx");复制代码
//发送数据给服务器
xdr.send();
Example例子
复制代码
复制代码
转载于:https://juejin.im/post/5b3de1715188251aee137dd4
统计上报---日志上报成功率高的方式相关推荐
- 怎样优化IM即时通讯移动端APP的日志上报机制
当前的移动互联网时代,移动端应用的流量昂贵和敏感,为了统计APP内用户行为,或者需要收集某些产品数据,往往需要进行日志上报.日志上报往往又非常费流量,有没有一些好的节省流量的优化方法呢,这是本文将要讨 ...
- 为什么别人家的APP,上报日志就这么省流量?
为了统计APP内用户行为,或者需要收集某些产品数据,APP往往需要进行日志上报,日志上报往往又非常费流量,大家的APP是怎么上报日志的呢? 画外音:用户流量的大头,是日志上报? APP可不可以不上报日 ...
- AndroidAPP用邮件收集用户上报日志
在许多的Android项目 中,我们都会设置一个让用户提意见的功能,比较多的做法,就是申请一个邮箱,通过用户反馈后让内容发到邮箱中,然后查看. 本篇的邮箱发送,属于使用代码进行发送第三方邮件,即本来你 ...
- Docker下ELK三部曲之三:K8S上的ELK和应用日志上报
本章是<Docker下ELK三部曲>系列的终篇,前面章节已经详述了ELK环境的搭建以及如何制作自动上报日志的应用镜像,今天我们把ELK和web应用发布到K8S环境下,模拟多个后台serve ...
- Android acra 监控报错日志上报(acra版本4.9)
使用acra监控app运行时的崩溃日志,并上报服务器,方便排错. acra是一款优秀的开源日志上报项目.它可以在你软件运行发生anr,carsh,oom等崩溃状况时拦截并收集报错信息上报服务端,与友盟 ...
- Centos7搭建sftp服务器,开启sftp上报日志
需求:192.168.56.103服务器搭建sftp服务,配置sftp上报日志(类似vsftpd的/var/log/xferlog) 1.创建用户组sftpgroup,添加用户sftpuser(密码为 ...
- CentOS 7.2下ELK分析Nginx日志生产实战(高清多图)
注:本文系原创投稿 本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名 ...
- 利用ELK分析Nginx日志生产实战(高清多图)
本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...
- slf4j日志的最优使用方式
slf4j简介 即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J是一个用于日志系统的简单 ...
最新文章
- Bagging和Boosting 概念及区别
- UpdatePanel AsyncPostBackTrigger PostBackTrigger 区别
- python网上编程课程-什么是Python编程课程
- hadoop之 参数调优
- FreeMarker 快速入门
- 2013计算机二级试题,2013全国计算机二级上机考试试题46-100套试题
- windows下配置tensorflow
- Magento: 解决 Bootstrap 3 与prototype并用的时候, 下拉菜单消失的问题 Bootstrap 3 dropdown menu dis...
- 多线程编程-工具篇-BlockingQueue
- Thinkphp开发时关闭缓存的方法
- java项目学习_一个Java项目的学习
- xcode4.1自带SVN配置
- vue-html5-editor接收数据,在vue中获取wangeditor的html和text的操作
- Flex【原创】惯性定位效果
- hashmap-put方法过程
- alternate rows shading using conditional formatting
- ELF文件和BIN文件 uboot.elf uboot.bin
- 2022年最新全国各省五级行政区划代码(省/市/区县/乡镇/村)
- 202101汇率换算
- 《嵌入式系统原理与应用》 |(三) ARM-Cortex M3处理器 知识梳理
热门文章
- tl r402路由器设置_怎么进入路由器设置界面
- uc的剪切板能关掉吗_罗永浩的“卖身契”有法律效力吗?
- 计算机伦理问题案例分析,基于网络环境的案例教学在《计算机伦理学》中的实践研究...
- dw6能编译asp吗,让Adobe Dreamweaver CC支持ASP
- java 事件驱动模式_事件驱动
- linux 安装包 在此作用域中尚未声明_Linux运行go项目报错:copy_file_range: bad file descriptor...
- oracle 11.2.0.3 asm非rac双机,oracle11.2.0.4 rac asm启动故障
- 旋转的Apriltag码
- 第十六届智能车竞赛西部赛区
- 2021年广东赛区线上比赛高校组合点-五邑大学