使用WebTracking采集前端日志

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

如需收集和分析用户在浏览器、小程序上的信息,例如用户的浏览行为记录、购买行为记录、停留时间,可以使用WebTracking功能。只需对业务代码进行较少的改动,就可以将用户行为信息上传到日志服务的Logstore中。

什么是WebTracking

WebTracking是一种通过向前端页面添加特定代码段,来跟踪用户行为的技术。日志服务的WebTracking能够在浏览器、小程序和移动端中采集用户行为数据,并将其上传至Logstore。例如:

  • 用户使用的浏览器、操作系统、分辨率等信息。

  • 用户浏览行为记录(例如:用户在网站上的单击行为、购买行为等信息)。

  • 用户在App中的停留时间、是否活跃等信息。

WebTracking提供安全接入和匿名写入两种数据上传方案:

方案

安全性

方案说明

适用环境

场景导航

安全接入:集成STSWebTracking SDK

通过在前端应用中集成WebTracking SDK,并结合STS生成安全令牌,实现日志的安全上传。

生产环境

快速验证:匿名写入

允许客户端在无需身份验证的情况下直接写入数据。支持以下四种方式:

  • WebTracking SDK

  • HTTP GET请求

  • HTML 标签

  • OpenAPI

测试环境

前提条件

创建Project

若无可用Project,可参考此处步骤创建一个基础Project,详细配置信息参见管理Project

登录日志服务控制台单击创建Project完成下述基础配置,其他配置保持默认即可:

  • 所属地域:根据日志来源等信息选择合适的阿里云地域,创建后不可修改。

  • Project名称:设置名称,名称在阿里云地域内全局唯一,创建后不可修改。

创建Logstore

若无可用Logstore,可参考此处步骤创建一个基础Logstore,详细配置信息参见管理Logstore

  1. 登录日志服务控制台,在Project列表中单击待操作的Project。

  2. 日志存储 > 日志库页签中,单击+图标。

  3. 填写Logstore名称,其余配置保持默认。

image

权限准备(仅安全接入需要)

  1. 创建用于扮演角色的RAM用户:创建时访问方式选择使用永久 AccessKey 访问,并保存AccessKey信息。

    重要

    RAM用户的AccessKey Secret只在创建时显示,不支持查询。请妥善保管,谨防泄露。

  2. RAM用户授予扮演角色的权限:为RAM用户添加AliyunSTSAssumeRoleAccess权限,使其可以通过扮演RAM角色获取临时身份凭证。

  3. 创建用于前端写入日志的RAM角色:创建RAM用户要扮演的RAM角色,例如命名为:sls-web-tracking

  4. 创建写入日志的自定义权限策略:该策略命名为post-logs-policy,在脚本编辑页签,使用以下脚本替换配置框中的原有内容,并将<Project名称><Logstore名称>替换为实际的Project、Logstore名称。

    重要

    该策略只能向指定的SLS Logstore上传日志。可以根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。更多信息,请参见RAM自定义授权示例

    {
      "Version":"1",
      "Statement":[
        {
          "Effect":"Allow",
          "Action":[
            "log:PostLogStoreLogs",
            "log:PutLogs"
          ],
          "Resource":[
            "acs:log:*:*:project/<Project名称>/logstore/<Logstore名称>"
          ]
        }
      ]
    }
  5. RAM角色授予写入日志的权限:为RAM角色sls-web-tracking授予创建的自定义权限post-logs-policy,以便被RAM用户扮演时能获取所需的权限。

  6. 配置环境变量:在业务服务器的环境变量中配置RAM用户的访问密钥,具体操作参见Linux、macOSWindows系统配置环境变量

安全接入:集成STSWebTracking SDK

该方案通过在业务服务器部署STS临时凭证服务,并与客户端集成的WebTracking SDK相结合,将前端日志安全、直接地上传至日志服务的Logstore。流程如下:

image
  1. 客户端请求凭证:前端应用(浏览器、小程序、移动端)向业务服务器发起请求,申请获取用于上传日志的临时访问凭证。

  2. 业务服务器获取临时STS Token:业务服务器在验证客户端请求的合法性后,使用提前创建的RAM用户的AK作为访问凭证,调用STS服务的AssumeRole接口 - 获取RAM角色的临时身份凭证

    阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务,通过STS可以获取自定义时效和访问权限的临时身份凭证。
  1. 返回临时凭证:STS服务检测AK的合法性,并验证RAM用户具备扮演目标RAM角色的权限后,向业务服务器返回STS Token。

  2. 客户端获取临时凭证:业务服务器将获取到的STS Token返回给客户端。

  3. 客户端上传日志:客户端使用获取到的STS Token将采集到的日志上传到指定的Logstore。

  4. SLS鉴权与存储:日志服务验证STS Token的有效性以及是否具备访问目标日志库的权限后,处理客户端上传日志请求,并返回上传结果。

浏览器端日志直传

  • 一键部署:通过资源编排服务(ROS)自动创建并配置所需资源,快速体验方案效果。

  • 手动部署:手动完成后端服务和前端应用的配置,可与现有业务集成。示例工程请参见:simple-web-tracking-sts.zip

手动部署

1. 搭建STS临时凭证下发服务

在业务服务器上集成STS SDK,实现一个获取临时STS身份凭证的接口。前端应用后续将通过访问此接口,动态获取用于向日志服务上传日志的临时身份凭证。

  1. 创建项目目录:登录服务器,执行以下命令,创建并进入项目的工作目录。

    mkdir my_web_sample
    cd my_web_sample
  2. 安装依赖:执行以下命令,安装 Flask Web 框架及阿里云 SDK 相关的依赖库。

    pip3 install Flask==3.1.2
    pip3 install aiohttp==3.8.4
    pip3 install alibabacloud-credentials==0.3.2
    pip3 install alibabacloud-sts20150401==1.1.3
    pip3 install alibabacloud-tea==0.3.2
    pip3 install alibabacloud-tea-openapi==0.3.7
    pip3 install alibabacloud-tea-util==0.3.8
    pip3 install alibabacloud-tea-xml==0.0.2
  3. 编写后端代码:创建main.py文件,并添加以下Python代码。

    重要
    • 将代码中的<YOUR_ROLE_ARN>替换为前提条件中创建的RAM角色sls-web-trackingARN。ARN获取方式参见查看RAM角色

      2024-05-09_17-45-50.png

    • 将代码中的<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称,例如role_session_test

    import json
    from flask import Flask, render_template
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_sts20150401.client import Client as Sts20150401Client
    from alibabacloud_sts20150401 import models as sts_20150401_models
    from alibabacloud_credentials.client import Client as CredentialClient
    
    app = Flask(__name__)
    
    # 将<YOUR_ROLE_ARN>替换为RAM角色的ARN。
    role_arn_for_oss_upload = '<YOUR_ROLE_ARN>'
    # 设置为STS服务的地域,例如cn-hangzhou。
    region_id = 'cn-hangzhou'
    
    @app.route("/")
    def hello_world():
        return render_template('index.html')
    
    @app.route('/get_sts_token', methods=['GET'])
    def get_sts_token():
        # 初始化 CredentialClient 时不指定参数,代表使用默认凭据链。
        # 在本地运行程序时,可以通过环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET 指定 AK;
        # 在 ECS\ECI\容器服务上运行时,可以通过环境变量 ALIBABA_CLOUD_ECS_METADATA 来指定绑定的实例节点角色,SDK 会自动换取 STS 临时凭证。
        config = Config(region_id=region_id, credential=CredentialClient())
        sts_client = Sts20150401Client(config=config)
        assume_role_request = sts_20150401_models.AssumeRoleRequest(
            role_arn=role_arn_for_oss_upload,
            # 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称。
            role_session_name='<YOUR_ROLE_SESSION_NAME>'
        )
        response = sts_client.assume_role(assume_role_request)
        token = json.dumps(response.body.credentials.to_map())
        return token
    
    
    app.run(host="0.0.0.0", port=80)
  4. 启动后端应用:使用在前提条件中创建的RAM用户的访问密钥启动应用程序。

    ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py
  5. 验证接口:在浏览器中访问http://<服务器公网IP地址>/get_sts_token,成功返回示例如下:

    sts token.png

2. 配置前端应用以采集和上传日志

本步骤的目标是在 Web 前端项目中集成 WebTracking SDK。该 SDK 会自动调用后端的 /get_sts_token接口获取凭证,并将用户行为日志安全地发送到指定的 Logstore。

  1. 准备前端开发环境:Ctrl + C停止应用程序,在项目根目录 (my_web_sample) 下,执行以下命令安装 npm、Parcel 打包工具,并创建前端所需目录:

    # 安装npm
    yum install npm
    
    # 安装Parcel
    npm install -g parcel-bundler
    
    # 创建前端项目文件
    mkdir templates static src
  2. 安装前端依赖:执行以下命令,安装 SLS 的 Web Tracking SDK 及其 STS 插件。

    # 安装项目依赖
    npm install --save @aliyun-sls/web-track-browser
    npm install --save @aliyun-sls/web-sts-plugin
  3. 编写前端代码:在src目录下创建index.js文件,并添加如下代码:

    • 请将代码中的${project}${logstore}替换为前提条件中创建的Project名称和Logstore名称。

    • 请将代码中的<ECS实例公网IP地址>替换为STS服务所在的服务器地址。

    import SlsTracker from "@aliyun-sls/web-track-browser";
    import createStsPlugin from "@aliyun-sls/web-sts-plugin";
    
    const opts = {
      host: "cn-hangzhou.log.aliyuncs.com", // 所在地域的服务入口。例如cn-hangzhou.log.aliyuncs.com
      project: "${project}", // Project 名称
      logstore: "${logstore}", // Logstore 名称
      time: 10, // 发送日志的时间间隔,默认是10秒
      count: 10, // 发送日志的数量大小,默认是10条
      topic: "topic", // 自定义日志主题
      source: "source",
      tags: {
        tags: "tags",
      },
    };
    
    const stsOpt = {
      accessKeyId: "",
      accessKeySecret: "",
      securityToken: "",
      // 以下是一个 stsToken 刷新函数的简单示例
      refreshSTSToken: () =>
        new Promise((resolve, reject) => {
          const xhr = new window.XMLHttpRequest();
          xhr.open("GET", "http://<ECS实例公网IP地址>/get_sts_token", true);
          xhr.send();
          xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
              if (xhr.status === 200) {
                let credential = JSON.parse(xhr.response);
                // 函数的本质目的:设置 stsOpt 的临时密钥和令牌
                stsOpt.accessKeyId = credential.AccessKeyId;
                stsOpt.accessKeySecret = credential.AccessKeySecret;
                stsOpt.securityToken = credential.SecurityToken;
                resolve();
              } else {
                reject("Wrong status code.");
              }
            }
          };
        }),
      // refreshSTSTokenInterval: 300000,
      // stsTokenFreshTime: undefined,
    };
    
    const tracker = new SlsTracker(opts);
    // 创建 sts 插件
    const stsPlugin = createStsPlugin(stsOpt);
    // 使用 sts 插件
    tracker.useStsPlugin(stsPlugin);
    
    // 用户登录跟踪
    document.getElementById("loginButton").addEventListener("click", () => {
      const username = document.getElementById("username").value;
      tracker.send({
        eventType: "login",
        username: username,
      });
      console.log("Login event tracked for:", username);
    });
    
    // 商品浏览跟踪
    document.querySelectorAll(".product").forEach((productButton) => {
      productButton.addEventListener("click", (event) => {
        const productName = event.target.getAttribute("data-product-name");
        const productPrice = event.target.getAttribute("data-price");
        tracker.send({
          eventType: "view_product",
          productName: productName,
          price: productPrice,
        });
        console.log("Product view tracked for:", productName);
      });
    });
    
    // 订单提交跟踪
    document.getElementById("orderButton").addEventListener("click", () => {
      tracker.send({
        eventType: "place_order",
        orderDetails: "Order placed for example items",
      });
      console.log("Order placed event tracked");
    });
    
  4. 创建HTML模板文件:在templates目录中创建一个index.html文件,在这个文件中,添加以下HTML代码。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>WebTracking Static Example</title>
    </head>
    <body>
        <h1>Welcome to Simple Web Store</h1>
        
        <!-- 用户登录 -->
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username">
            <button id="loginButton">Login</button>
        </div>
        
        <!-- 商品列表 -->
        <div>
            <h2>Products</h2>
            <button class="product" data-product-name="Laptop" data-price="1200">Laptop - $1200</button>
            <button class="product" data-product-name="Smartphone" data-price="800">Smartphone - $800</button>
            <button class="product" data-product-name="Tablet" data-price="500">Tablet - $500</button>
        </div>
        
        <!-- 提交订单 -->
        <div>
            <h2>Your Order</h2>
            <button id="orderButton">Place Order</button>
        </div>
        
        <script type="module" src="{{ url_for('static', filename='js/index.js') }}"></script>
    </body>
    </html>
  5. 打包并运行应用

    1. 在项目根目录my_web_sample下,执行如下命令打包静态资源。

      parcel build src/index.js --out-dir static/js --public-url ./js
    2. 使用前提条件获取的访问密钥启动后端应用程序。

      ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py
    3. 在浏览器中访问http://<服务器公网IP地址>,模拟用户操作(输入用户名、点击商品、下单等)以触发日志上报。

3. 在日志服务控制台查看日志

  1. 登录日志服务控制台Project列表区域,单击目标Project。

  2. 在日志库中,选择目标Logstore右侧的修改日志库 > 消费预览。在消费预览面板,查看成功上传的日志。

一键部署

执行以下操作使用资源编排一键部署示例工程。

  1. 单击一键部署,在ROS控制台页面完成如下配置后单击下一步:检查并确认

    • 地域:选择资源所在的地域。

    • 日志服务SLS配置:设置用于接收日志的ProjectLogstore名称。

    • 云服务器ECS配置:选择交换机可用区,ECS实例类型,配置实例密码

    • 进行安全确认

  2. 单击创建,等待资源栈创建完成后,单击输出页签,单击WebTrackingUrl

  3. 在打开的页面中输入用户名、选择商品、并点击下单,模拟真实用户在浏览器的行为。

  4. 查看日志。

    1. 登录日志服务控制台Project列表区域,单击目标Project。

    2. 在日志库中,选择目标Logstore右侧的修改日志库 > 消费预览。在消费预览面板,查看成功上传的日志。

  5. 清理资源。

    1. 登录资源编排控制台。在左侧导航栏,单击资源栈

    2. 资源栈列表页面,找到创建的资源栈,然后在其操作列单击删除

小程序端日志直传

1. 搭建STS临时凭证下发服务

本步骤的目标是在业务服务器上集成STS SDK,实现一个获取临时STS身份凭证的接口。小程序客户端后续将通过访问此接口(/get_sts_token),动态获取用于向日志服务上传数据的临时身份凭证。

  1. 创建项目目录:登录服务器,执行以下命令,创建并进入项目的工作目录。

    mkdir my_web_sample
    cd my_web_sample
  2. 安装依赖:执行以下命令,安装 Flask Web 框架及阿里云 SDK 相关的依赖库。

    pip3 install Flask
    pip3 install attr
    pip3 install yarl
    pip3 install async_timeout
    pip3 install idna_ssl
    pip3 install attrs
    pip3 install aiosignal
    pip3 install charset_normalizer
    pip3 install alibabacloud_tea_openapi
    pip3 install alibabacloud_sts20150401
    pip3 install alibabacloud_credentials
  3. 编写后端代码:创建main.py文件,并添加以下Python代码。

    重要
    • 请将代码中的<YOUR_ROLE_ARN>替换为前提条件中创建的RAM角色sls-web-trackingARN。ARN获取方式请参见查看RAM角色

      2024-05-09_17-45-50.png

    • 将代码中的<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称,例如role_session_test

    import json
    from flask import Flask, render_template
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_sts20150401.client import Client as Sts20150401Client
    from alibabacloud_sts20150401 import models as sts_20150401_models
    from alibabacloud_credentials.client import Client as CredentialClient
    
    app = Flask(__name__)
    
    # 将<YOUR_ROLE_ARN>替换为RAM角色的ARN。
    role_arn_for_oss_upload = '<YOUR_ROLE_ARN>'
    # 设置为STS服务的地域,例如cn-shanghai。
    region_id = 'cn-shanghai'
    
    @app.route('/get_sts_token', methods=['GET'])
    def get_sts_token():
        # 初始化 CredentialClient 时不指定参数,代表使用默认凭据链。
        # 在本地运行程序时,可以通过环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET 指定 AK;
        # 在 ECS\ECI\容器服务上运行时,可以通过环境变量 ALIBABA_CLOUD_ECS_METADATA 来指定绑定的实例节点角色,SDK 会自动换取 STS 临时凭证。
        config = Config(region_id=region_id, credential=CredentialClient())
        sts_client = Sts20150401Client(config=config)
        assume_role_request = sts_20150401_models.AssumeRoleRequest(
            role_arn=role_arn_for_oss_upload,
            # 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称。
            role_session_name='<YOUR_ROLE_SESSION_NAME>'
        )
        response = sts_client.assume_role(assume_role_request)
        token = json.dumps(response.body.credentials.to_map())
        return token
    
    
    app.run(host="0.0.0.0", port=80)
  4. 启动后端应用:使用前提条件中创建的RAM用户的访问密钥启动应用程序。

    ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py
  5. 验证接口:在浏览器中访问http://<服务器公网IP地址>/get_sts_token,成功返回示例如下:

    sts token.png

2. 配置小程序客户端以采集和上传日志

本步骤的目标是在小程序客户端中集成WebTracking SDK。SDK 将自动调用后端接口获取凭证,并将用户行为日志安全地发送到指定的 Logstore。示例工程请参见:sls-mini-tracking-sts.zip

说明

小程序的开发流程和代码构成,请参见支付宝文档中心

  1. 小程序开发环境准备

    1. 下载并安装小程序开发者工具

    2. 创建和体验Todo App 小程序

    3. 安装npm。

      yum install npm
    4. 安装项目依赖。

      npm install --save @aliyun-sls/web-track-mini
      npm install --save @aliyun-sls/web-sts-plugin
  2. 配置app.js文件:

    • 请将代码中的${project}${logstore}替换为准备工作中创建的Project名称和Logstore名称。

    • 请将代码中的<ECS实例公网IP地址>替换为STS服务所在的服务器地址。

      // app.js
      import SlsTracker from '@aliyun-sls/web-track-mini';
      import createStsPlugin from '@aliyun-sls/web-sts-plugin';
      
      App({
        todos: [
          { text: 'Learning Javascript', completed: true },
          { text: 'Learning ES2016', completed: true },
          { text: 'Learning 支付宝小程序', completed: false },
        ],
        userInfo: null,
        tracker: null,
      
        onLaunch: function() {
          // 在应用启动时进行初始化
          this.initSlsTracker();
        },
      
        initSlsTracker: function() {
          const opts = {
            host: 'cn-shanghai.log.aliyuncs.com', // 替换为你的服务入口
            project: '${project}', // 替换为你的 Project 名称
            logstore: '${Logstore}', // 替换为你的 Logstore 名称
            time: 10,
            count: 10,
            topic: 'topic',
            source: 'source',
            tags: {
              tags: 'tags',
            },
          };
      
          const stsOpt = {
            accessKeyId: '',
            accessKeySecret: '',
            securityToken: '',
            refreshSTSToken: () => new Promise((resolve, reject) => {
              my.request({
                url: 'http://${ECS实例的公网IP}}/get_sts_token', // 替换为后端 STS Token 提供服务的真实地址
                method: 'GET',
                success: (res) => {
                  if (res.statusCode === 200) {
                    let credential;
      
                    // 检查返回的数据类型确保是字符串,若不是字符串则可能已是对象
                    if (typeof res.data === "string") {
                      //解析为JSON对象
                      credential = JSON.parse(res.data);
                    } else {
                      // 直接使用对象
                      credential = res.data;
                    }
                    stsOpt.accessKeyId = credential.AccessKeyId;
                    stsOpt.accessKeySecret = credential.AccessKeySecret;
                    stsOpt.securityToken = credential.SecurityToken;
                    resolve(credential);
                  } else {
                    reject(new Error('Failed to refresh STS token with status code: ' + res.statusCode));
                  }
                },
                fail: (err) => {
                  reject(new Error('Failed to refresh STS token', err));
                },
              });
            }),
          };
      
          const tracker = new SlsTracker(opts);
          const stsPlugin = createStsPlugin(stsOpt);
          tracker.useStsPlugin(stsPlugin);
      
          // 以单条日志上传为例,只要启动小程序,就会发送一条日志。
          // tracker.send({
          //   eventType:'view_product',
          //   productName: 'Tablet',
          //   price: 500  
          // });
      
      
          this.tracker = tracker;
        },
      
        
      });
      
  3. 运行与验证:在开发者工具,单击页面右上角的编译image。在右侧小程序预览页面,单击小程序的Todo页面的Add Todo按钮或输入Todo项时,小程序会直接向日志服务的Logstore上传日志,无需经过服务器。

    image

3. 在日志服务控制台查看日志

  1. 登录日志服务控制台Project列表区域,单击目标Project。

  2. 在日志库中,选择目标Logstore右侧的修改日志库 > 消费预览。在消费预览面板,查看成功上传的日志。

    image

4. 小程序上线前置条件

本文在开发者工具中对示例程序进行本地调试,如需正式上线小程序,必须完成以下步骤:

  1. 创建开发者账号,创建小程序,将小程序提交审核等,具体参见开发者账号注册

  2. 在开发者工具中忽略域名合法性,检查便于调试,步骤请参见接入准备

    image

  3. 支付宝控制台中配置以下域名白名单。

    1. 添加日志服务的服务器域名(request合法域名)。格式为https://${project}.${host}

      • project:日志服务的Project名称

      • host:Project的域名,本文示例为sls-webtracking-mini.cn-shanghai.log.aliyuncs.com,操作步骤参见服务器域名白名单

        image

    2. 添加小程序后端服务器的域名,本文示例只有小程序客户端代码,正式上线小程序还需要开发服务端代码。服务器域名白名单只支持HTTPS协议,配置HTTPS协议需要在服务器部署SSL证书

      重要

      本文示例仅用于功能演示,在开发者工具中忽略域名合法性。小程序正式上线前,必须配置域名检查。

移动端日志直传

1. 搭建STS临时凭证下发服务

本步骤的目标是在业务服务器上集成STS SDK,实现一个获取临时STS身份凭证的接口。移动端App将通过访问此接口(/get_sts_token),动态获取用于向日志服务上传数据的临时身份凭证(STS Token)。

  1. 下载并配置示例程序:

    1. 根据技术栈选择并下载对应语言的示例程序,下载地址请参见PHP、Java、Ruby、Node.js

    2. 修改语言包内的 config.json 配置文件。

      关键字段详解

      示例

      {
          "AccessKeyID" : "",
          "AccessKeySecret" : "",
          "RoleArn" : "",
          "TokenExpireTime" : "900",
          "PolicyFile": "policy/write_policy.txt"
      } 

      AccessKeyID String

      RAM用户的访问密钥ID。请勿使用主账号的AccessKey ID。

      AccessKeySecret String

      RAM用户的访问密钥Secret。请勿使用主账号的AccessKeySecret。

      RoleArn String

      RAM角色的RoleArnARN获取方式请参见查看RAM角色

      TokenExpireTime String

      移动端应用获取到的Token的失效时间。

      最少是默认值900s。

      PolicyFile String

      Token所要拥有的权限列表的文件,可以不修改默认值。

      此处提供两种最常用的Token权限文件,位于policy目录下面。 可以根据业务需求设计policy文件。

      • write_policy.txt:指定了该Token拥有该账号下Project的写入权限。使用write_policy.txt权限文件时,请根据实际替换该文件中的Project名称。

      • readonly_policy.txt:指定了该Token拥有该账号下Project的读取权限。

      Token的最终权限为RAM角色权限与权限文件的权限交集。如果未设置权限文件,则Token的最终权限为RAM角色权限。

  2. 运行示例代码:根据对应语言的说明启动服务。以 Java 版本(需 JDK 1.7+)为例,将示例代码导入 Java 工程后运行 main 函数即可。程序默认会监听 7080 端口,等待来自移动端的 HTTP 请求。

2. 在移动端集成SDK并实现日志直传

1. 获取STS临时凭证:以HTTP请求形式访问服务的7080端口,获取临时安全令牌。返回结果示例如下:

{
  "StatusCode":"200",
  "AccessKeyId":"STS.3pdgagd****",
  "AccessKeySecret":"rpnwO9wr34tGdrddgsR2Y****",
  "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjR****tZGVtbzI=",
  "Expiration":"2021-11-20T08:23:15Z"
}                          

2. 使用临时凭证上传日志:示例代码演示通过移动客户端使用临时安全令牌直接将日志写入到日志库中。

const ALY = require("aliyun-sdk");

const sls = new ALY.SLS({
  accessKeyId: "Your temporary accesKeyId",
  secretAccessKey: "Your temporary accessKeySecret",
  securityToken: "Your sts token",
  endpoint: "http://cn-hangzhou.log.aliyuncs.com",
});

// -------------------------------
// put logs
// -------------------------------
const projectName = "your_project_name";
const logStoreName = "your_logstore";

const logGroup = {
  logs: [
    {
      time: Math.floor(new Date().getTime() / 1000),
      contents: [
        {
          key: "a",
          value: "1",
        },
        {
          key: "a",
          value: "2",
        },
        {
          key: "a",
          value: "3",
        },
      ],
    },
  ],
  topic: "vv",
  source: "127.0.0.1",
};

sls.putLogs(
  {
    //必选字段
    projectName: projectName,
    logStoreName: logStoreName,
    logGroup: logGroup,
  },
  function (err, data) {
    if (err) {
      console.log("error:", err);
      return;
    }

    console.log("success:", data);
  }
);

3. 在日志服务控制台查看日志

  1. 登录日志服务控制台Project列表区域,单击目标Project。

  2. 在日志库中,选择目标Logstore右侧的修改日志库 > 消费预览。在消费预览面板,查看成功上传的日志。

快速验证:匿名写入

本方案通过开启WebTracking开关,开放Logstore的公网写入权限,允许客户端使用WebTracking SDK、HTTP请求等多种方式直接上报日志数据。开启步骤如下:

控制台

  1. 登录日志服务控制台。在Project列表区域,单击目标Project。

  2. 日志存储 > 日志库页签中,选择目标Logstore右侧的图标 > 修改。在Logstore属性页面,单击页面右上方的修改

  3. 打开WebTracking开关,然后单击保存

API

调用UpdateLogStore接口,设置enable_tracking参数为true。

警告

严禁用于生产环境。

  • 开启Web Tracking开关,意味着将Logstore的写入权限向公网开放,任何持有接入点信息的用户均可写入数据。

  • 适用场景:仅限于无数据安全要求的开发、测试环境,用于快速验证日志上报链路。

流程如下:

image

浏览器端日志匿名上传

选择接入方式

  • WebTracking SDK:在前端代码中集成日志服务提供的WebTracking SDK,将自定义类型的日志上传到Logstore。

  • HTTP GET请求:通过构造URL直接发送GET请求上报数据,适合简单、少量日志的收集。

  • HTML标签:在HTML页面中嵌入一个<img>标签,将日志内容编码在src属性的URL中。这种方式无需JavaScript环境,也不需要设置跨域访问。

  • OpenAPI:如果请求的数据量较大,可以通过调用API接口,以POST方式批量上报日志。

WebTracking SDK

重要

使用WebTracking SDK上传日志,每次写入的日志数量上限为3MB或者4096条。关于WebTracking SDK的更多信息,请参见SLS WebTracking SDK

  1. 安装和配置SDK

    npm方式

    1. 已安装Node.js。在服务器上运行以下代码,安装依赖:

      npm install --save @aliyun-sls/web-track-browser
    2. 在应用程序中添加以下代码,配置SDK。

      关键字段详解

      示例

      import SlsTracker from '@aliyun-sls/web-track-browser'
      
      const opts = {
        host: '${host}', // 所在地域的服务入口。例如cn-hangzhou.log.aliyuncs.com
        project: '${project}', // Project名称。
        logstore: '${logstore}', // Logstore名称。
        time: 10, // 发送日志的时间间隔,默认是10秒。
        count: 10, // 发送日志的数量大小,默认是10条。
        topic: 'topic',// 自定义日志主题。
        source: 'source',
        tags: {
          tags: 'tags',
        },
      }
      
      const tracker = new SlsTracker(opts)  // 创建SlsTracker对象

      host String 必填

      日志服务所在地域的Endpoint。此处以杭州为例,其它地域请根据实际情况参考服务入口填写。

      project String 必填

      日志服务Project名称。

      logstore String 必填

      用于存储日志的Logstore名称。

      time String 可选

      发送日志的时间间隔,默认值为10秒。

      count String 可选

      发送日志的数量大小,默认值为10。

      topic String 可选

      日志主题。

      source String 可选

      日志来源。

      tags String 可选

      日志标签信息。

    CDN方式

    1. HTML文件的<body>中添加以下代码,从CDN引入WebTracking SDK的资源文件。如果使用CDN方式,SDK版本最高为0.3.5,更多版本请参见SLS WebTracking SDK

      <script src="https://g.alicdn.com/sls/sls-js-sdk/0.3.5/web-track-browser.js"></script>
    2. 在网站的JavaScript文件中添加以下代码。

      关键字段详解

      示例

      if (window.SLS_Tracker) {
             const tracker = new SLS_Tracker({
             host: '${host}', // 所在地域的服务入口。例如cn-hangzhou.log.aliyuncs.com
             project: '${project}', // Project名称。
             logstore: '${logstore}', // Logstore名称。
             time: 10, // 发送日志的时间间隔,默认是10秒。
             count: 10, // 发送日志的数量大小,默认是10条。
             topic: 'topic',// 自定义日志主题。
             source: 'source',
             tags: {
                 tags: 'tags',
             },
          })
      }

      host String 必填

      日志服务所在地域的Endpoint。此处以杭州为例,其它地域请根据实际情况参见服务入口填写。

      project String 必填

      日志服务Project名称。

      logstore String 必填

      用于存储日志的Logstore名称。

      time String 可选

      发送日志的时间间隔,默认值为10秒。

      count String 可选

      发送日志的数量大小,默认值为10。

      topic String 可选

      日志主题。

      source String 可选

      日志来源。

      tags String 可选

      日志标签信息。

  2. 上传日志:上传单条日志时,每条日志单独作为一个对象Object。上传多条日志时,数据结构是包含多个对象Object的数组Array

    单条日志上传

    tracker.send({
      eventType:'view_product',
      productName: 'Tablet',
      price: 500
    })

    单条日志立即上传(timecount参数不生效)

    tracker.sendImmediate({
      eventType:'view_product',
      productName: 'Tablet',
      price: 500
    })

    批量日志上传

    tracker.sendBatchLogs([
      {
        eventType: 'view_product',
        productName: 'Tablet',
        price: 500
      },
      {
        eventType: 'view_product',
        productName: 'Laptop',
        price: 1200
      }
    ])

    批量日志立即上传(timecount参数不生效)

    tracker.sendBatchLogsImmediate([
      {
        eventType:'view_product',
        productName: 'Tablet',
        price: 500
      },
      {
        eventType:'view_product',
        productName: 'Laptop',
        price: 1200
      }
    ])
  3. 在日志服务控制台查看日志

    1. 登录日志服务控制台Project列表区域,单击目标Project。

    2. 在日志库中,选择目标Logstore右侧的修改日志库 > 消费预览。在消费预览面板,查看成功上传的日志。

HTTP GET 请求

将日志字段作为URL的参数,通过HTTP请求上传日志,请根据实际值替换参数。

curl --request GET 'https://${project}.${host}/logstores/${logstore}/track?APIVersion=0.6.0&key1=val1&key2=val2'
  • host:日志服务所在地域的Endpoint。更多信息,请参见服务入口

  • key1=val1&key2=val2:上传到日志服务的字段名称和字段值(Key-Value),支持设置多个字段,长度必须小于16 KB。

HTML标签

在前端页面中添加以下<img>标签,浏览器加载图片时会自动将URL中的参数作为日志内容上传。

<!-- 采集自定义字段 -->
<img src='https://${project}.${host}/logstores/${logstore}/track.gif?APIVersion=0.6.0&key1=val1&key2=val2'/>

<!-- 额外采集User-Agent和Referer -->
<img src='https://${project}.${host}/logstores/${logstore}/track_ua.gif?APIVersion=0.6.0&key1=val1&key2=val2'/>
说明

使用track_ua.gif会自动采集User-AgentReferer信息。为避免浏览器缓存,建议加入时间戳参数。

OpenAPI

调用PutWebtracking - 通过WebTracking批量写入日志接口上传多条日志。

小程序端日志匿名上传

WebTracking支持的小程序包括微信小程序、微信小游戏、支付宝小程序、字节跳动小程序、钉钉小程序、QQ小程序、QQ小游戏、百度小程序。

重要
  • 根据小程序平台的安全要求,为确保日志数据能从线上小程序正常上报,需要将其数据接收域名添加至小程序管理后台的request合法域名白名单。格式为https://${project}.${host}projecthost的含义参见下文。

  • 使用小程序端WebTracking SDK上传日志,每次写入的日志数量上限为10 MB。

  1. 安装和配置SDK:安装Node.js,在服务器上运行以下代码,安装依赖。

    npm install --save @aliyun-sls/web-track-mini
  2. 在业务程序中添加以下代码,配置SDK。

    重要

    开发快应用(quickApp小程序)时,创建SlsTracker对象前需要根据使用的请求模块额外添加配置项。以使用requesttask模块为例:

    //定义quickappSDK对象,将请求API封装成对象
    const quickappSDK = {     
          request: requesttask.request
        }
    
    const tracker = new SlsTracker({
          ...opts,
          platformSDK: quickappSDK,
          platformRequestName: 'request',
        })

    关键字段详解

    示例

    import SlsTracker from '@aliyun-sls/web-track-mini'
    
    const opts = {
      host: '${host}', // 所在地域的服务入口。例如cn-hangzhou.log.aliyuncs.com
      project: '${project}', // Project名称。
      logstore: '${logstore}', // Logstore名称。
      time: 10, // 发送日志的时间间隔,默认是10秒。
      count: 10, // 发送日志的数量大小,默认是10条。
      topic: 'topic',// 自定义日志主题。
      source: 'source',
      tags: {
        tags: 'tags',
      },
    }
    
    const tracker = new SlsTracker(opts)  // 创建SlsTracker对象

    host String 必填

    日志服务所在地域的Endpoint。此处以杭州为例,其它地域请根据实际情况填写。更多信息,请参见服务入口

    project String 必填

    日志服务Project名称。

    logstore String 必填

    用于存储日志的Logstore名称。

    time String 可选

    发送日志的时间间隔,默认值为10秒。

    count String 可选

    发送日志的数量大小,默认值为10。

    topic String 可选

    日志主题。

    source String 可选

    日志来源。

    tags String 可选

    日志标签信息。

  3. 上传日志:上传单条日志时,每条日志单独作为一个对象Object。上传多条日志时,数据结构是包含多个对象Object的数组Array

    单条日志上传

    tracker.send({
      eventType:'view_product',
      productName: 'Tablet',
      price: 500
    })

    单条日志立即上传(timecount参数不生效)

    tracker.sendImmediate({
      eventType:'view_product',
      productName: 'Tablet',
      price: 500
    })

    批量日志上传

    tracker.sendBatchLogs([
      {
        eventType: 'view_product',
        productName: 'Tablet',
        price: 500
      },
      {
        eventType: 'view_product',
        productName: 'Laptop',
        price: 1200
      }
    ])

    批量日志立即上传(timecount参数不生效)

    tracker.sendBatchLogsImmediate([
      {
        eventType:'view_product',
        productName: 'Tablet',
        price: 500
      },
      {
        eventType:'view_product',
        productName: 'Laptop',
        price: 1200
      }
    ])
  4. 在日志服务控制台查看日志

    1. 登录日志服务控制台Project列表区域,单击目标Project。

    2. 在日志库中,选择目标Logstore右侧的修改日志库 > 消费预览。在消费预览面板,查看成功上传的日志。

相关文档