Giter Club home page Giter Club logo

log's Introduction

log

前端日志的研究

code style fecs Build Status Test Coverage MIT license

Topic1: Log lib

思路

前端日志只是使用js往服务器上发送条请求, 大多情况是以图片为请求, 有体积小、响应快等特点. 在页面创建一个日志实例, 调用send方法可发送日志请求, 如:

var page = Log.create(图片地址);
page.send('id', 1);

特点

  • 使用简单
  • 空参数过滤
  • 线下地址 - 对线下环境添加debug.js, 可以修改为线下地址
  • 统一urlencode

开发环境

在开发环境下可把debug.js引用加载, 可以对空参数、参数超长、链接超长校验. 而参数的值是否符合预期, 没有做校验, 当然如果有对应的参数规范平台也可以在debug.js里校验.

方向 线上环境 开发环境
目标 容错高、稳定 有问题及时提示
空参数 过滤 过滤并提示
超长参数、请求超长 通过 通过并提示
重复参数 通过 通过并提示
urlencode 通过 通过并提示

Api

/**
 * 创建日志
 *
 * @param {string} url gif图链接
 * @param {Object} options 日志全局参数
 *
 * @return {Object} 实例对象
 */
Log.create(url, options);

/**
 * 发送日志
 *
 * @param  {Object|string} key   参数key或者数据对象, 会把全局里同名参数覆盖. 如果不是对象, 只能是string
 * @param  {string|undefined} value 参数值
 *
 * @return {Object}       this
 */
#send(key, value);

例子

// 页面a的点击日志
var clickLog = Log.create('/日志.gif', {
    page: 'a',
    type: 'click'
});

// 页面a的pv日志
var pvLog = Log.create('/日志.gif', {
    page: 'a',
    type: 'pv'
});


// 发送点击日志
clickLog.send({
    id: 1,
    width: 120
});
clickLog.send('xxxx', 1);

// 发送pv日志
pvLog.send({
    id: 1
});
pvLog.send('xxxx', 1);

问题

1. 如何保证参数正确

可以在debug.js里针对开发环境对参数进入逐一的校验, 或者在开发环境把图片地址修改为线下地址, 使用日志监控分析工具实时的处理线下图片地址

2. 如何自动化测试

由于日志很多都是交互时触发, 可使用模拟交互行为的工具, 如: selenium

3. 发送日志的格式、时机

目前只支持一维json对象发送, 会把值当前string发送, 在调用send时发送, 后续考虑多维度json结构

4. 采集信息?

目前只是一个简单的send库, 没有主动的收集用户信息, 如滚动监听、屏幕信息等, 后续考虑

Topic2: 用户行为收集

  1. 记录用户停留时长
  2. 自动发送, 自动调整发送时机
  3. mark的动作:
    1. 按时间点
    2. 停留时长
    3. 取值最大
    4. 取值最小
  4. 默认监听的行为
    1. scroll
    2. resize
    3. focus
    4. blur
    5. visibilitychange
  5. 提供cli命令解析日志, 并支持绘画出用户在页面内的行为
  6. 提供alias接口设置字段别名, 优化日志体积
const App = Log(options);

// 开始记录首页日志
App.use('index.html');

// 普通打点, 只记录打点时间
App.mark('DOM_READY');

// 普通打点, 只记录打点时间
App.mark('ON_LOAD');

// 记录用户浏览深度 + 浏览轨迹
let scrollTimer = null;
$(window).on('scroll.log', () => {
    clearTimeout(scrollTimer);
    scrollTimer = setTimeout(() => {
        App.mark('READ_HEIGHT', window.scrollY);
        App.mark('MAX_HEIGHT', window.scrollY, Log.markType.MAX);
    }, 300);
});

// 以文章id来统计文章的浏览时长
page.on('文章切换', () => {
    App.mark('ARTICLE_ID', page.article_id, Log.markType.TIME);
});

// 统计文章分页切换时间点
page.on('文章翻页', () => {
    App.mark('ARTICLE_PAGE', page.current_page);
});

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.