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

统计上报---日志上报成功率高的方式相关推荐

  1. 怎样优化IM即时通讯移动端APP的日志上报机制

    当前的移动互联网时代,移动端应用的流量昂贵和敏感,为了统计APP内用户行为,或者需要收集某些产品数据,往往需要进行日志上报.日志上报往往又非常费流量,有没有一些好的节省流量的优化方法呢,这是本文将要讨 ...

  2. 为什么别人家的APP,上报日志就这么省流量?

    为了统计APP内用户行为,或者需要收集某些产品数据,APP往往需要进行日志上报,日志上报往往又非常费流量,大家的APP是怎么上报日志的呢? 画外音:用户流量的大头,是日志上报? APP可不可以不上报日 ...

  3. AndroidAPP用邮件收集用户上报日志

    在许多的Android项目 中,我们都会设置一个让用户提意见的功能,比较多的做法,就是申请一个邮箱,通过用户反馈后让内容发到邮箱中,然后查看. 本篇的邮箱发送,属于使用代码进行发送第三方邮件,即本来你 ...

  4. Docker下ELK三部曲之三:K8S上的ELK和应用日志上报

    本章是<Docker下ELK三部曲>系列的终篇,前面章节已经详述了ELK环境的搭建以及如何制作自动上报日志的应用镜像,今天我们把ELK和web应用发布到K8S环境下,模拟多个后台serve ...

  5. Android acra 监控报错日志上报(acra版本4.9)

    使用acra监控app运行时的崩溃日志,并上报服务器,方便排错. acra是一款优秀的开源日志上报项目.它可以在你软件运行发生anr,carsh,oom等崩溃状况时拦截并收集报错信息上报服务端,与友盟 ...

  6. Centos7搭建sftp服务器,开启sftp上报日志

    需求:192.168.56.103服务器搭建sftp服务,配置sftp上报日志(类似vsftpd的/var/log/xferlog) 1.创建用户组sftpgroup,添加用户sftpuser(密码为 ...

  7. CentOS 7.2下ELK分析Nginx日志生产实战(高清多图)

    注:本文系原创投稿 本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名 ...

  8. 利用ELK分析Nginx日志生产实战(高清多图)

    本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...

  9. slf4j日志的最优使用方式

    slf4j简介 即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J是一个用于日志系统的简单 ...

最新文章

  1. Bagging和Boosting 概念及区别
  2. UpdatePanel AsyncPostBackTrigger PostBackTrigger 区别
  3. python网上编程课程-什么是Python编程课程
  4. hadoop之 参数调优
  5. FreeMarker 快速入门
  6. 2013计算机二级试题,2013全国计算机二级上机考试试题46-100套试题
  7. windows下配置tensorflow
  8. Magento: 解决 Bootstrap 3 与prototype并用的时候, 下拉菜单消失的问题 Bootstrap 3 dropdown menu dis...
  9. 多线程编程-工具篇-BlockingQueue
  10. Thinkphp开发时关闭缓存的方法
  11. java项目学习_一个Java项目的学习
  12. xcode4.1自带SVN配置
  13. vue-html5-editor接收数据,在vue中获取wangeditor的html和text的操作
  14. Flex【原创】惯性定位效果
  15. hashmap-put方法过程
  16. alternate rows shading using conditional formatting
  17. ELF文件和BIN文件 uboot.elf uboot.bin
  18. 2022年最新全国各省五级行政区划代码(省/市/区县/乡镇/村)
  19. 202101汇率换算
  20. 《嵌入式系统原理与应用》 |(三) ARM-Cortex M3处理器 知识梳理

热门文章

  1. tl r402路由器设置_怎么进入路由器设置界面
  2. uc的剪切板能关掉吗_罗永浩的“卖身契”有法律效力吗?
  3. 计算机伦理问题案例分析,基于网络环境的案例教学在《计算机伦理学》中的实践研究...
  4. dw6能编译asp吗,让Adobe Dreamweaver CC支持ASP
  5. java 事件驱动模式_事件驱动
  6. linux 安装包 在此作用域中尚未声明_Linux运行go项目报错:copy_file_range: bad file descriptor...
  7. oracle 11.2.0.3 asm非rac双机,oracle11.2.0.4 rac asm启动故障
  8. 旋转的Apriltag码
  9. 第十六届智能车竞赛西部赛区
  10. 2021年广东赛区线上比赛高校组合点-五邑大学