本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
集成日志服务WebTracking SDK,可采集前端应用的用户行为、问题定位、性能分析等关键数据,并将其安全、实时地上传至云端进行统一分析。
背景介绍
业务痛点:为深入分析用户行为,企业需持续采集前端日志,如设备类型、页面访问路径、点击与滚动等交互事件。传统做法是前端将日志发送至业务服务器,再由后端转发至日志系统,不仅消耗业务服务的网络带宽与计算资源,还可能因链路延长导致日志延迟,且在高并发场景下易成为性能瓶颈。
解决方案:阿里云日志服务通过 WebTracking 能力,允许前端应用直接将日志写入 SLS,无需经过业务服务器。该方式消除了中转环节,在保障高并发采集能力的同时,显著降低业务系统负载并提升日志上报的实时性。目前,WebTracking 支持以下两种接入方案,推荐优先采用STS安全直传模式:
STS 安全直传模式(推荐)
前端通过企业后端获取阿里云 STS 颁发的临时安全令牌(含临时 AccessKey、SecurityToken 和受限权限策略),并使用该令牌向 SLS 发起带签名的日志写入请求。凭证具备时效性和最小权限,可有效防范因前端配置泄露导致的日志伪造或数据污染,适用于生产环境。匿名直传模式
前端直接通过公开的 WebTracking Endpoint 写入日志,无需身份凭证,配置简单、接入快速。但需开启 Logstore 的匿名写入权限,一旦 Project 或 Logstore 信息泄露,可能被恶意利用,存在数据污染风险,仅建议用于测试环境。
准备云资源
开始采集日志前,需先创建用于存储和管理日志的基础资源。
步骤一:创建Project
Project 是日志服务的资源管理单元,用于隔离不同业务。
操作路径:登录日志服务控制台,单击创建Project。
配置项:
所属地域:根据日志来源选择,创建后不可修改。
Project名称:阿里云内全局唯一,创建后不可修改。
其他配置保持默认,单击创建。
步骤二:创建Logstore
Logstore 是日志的存储单元,所有前端日志都将写入此处。
操作路径: 进入目标 Project,在左侧导航栏,选择日志存储
, 单击 +。
配置项:
Logstore名称:在Project内唯一,创建后不可修改,如
web-tracking-logstore。Logstore类型:根据规格对比选择标准型或查询型。
计费模式:
按使用功能计费:适合日志量小或开发测试的场景。
按写入数据量计费:适合日志量稳定且需要长期分析的场景。
数据保存时间:默认为30天(支持1~3650 天)。
其他配置保持默认,单击确定。
STS 安全直传模式(推荐)
此方案通过引入后端凭证服务解决前端密钥安全问题,是生产环境部署的推荐方案。
工作原理
前端应用不保存长期密钥,而是向您所部署的STS服务(通常位于业务服务器)请求签发临时安全凭证。WebTracking SDK 使用该凭证上传日志,凭证默认有效期为60分钟,到期自动失效,安全可控。
客户端请求凭证:前端应用向业务服务器发起请求,申请用于上传日志的临时访问凭证。
服务器验证并获取临时凭证:业务服务器验证请求合法性后,使用预配置的RAM用户身份,调用阿里云STS的AssumeRole接口,申请扮演一个具备SLS写入权限的RAM角色。
STS签发临时凭证:STS验证角色权限后,生成包含AccessKey ID、AccessKey Secret和STS Token等信息的临时凭证。
服务器下发凭证:业务服务器将临时凭证返回给前端应用。
客户端上传日志:客户端使用该临时凭证,通过WebTracking SDK将采集到的日志上传至指定Logstore。
步骤一:配置RAM权限体系
此步骤为后端凭证服务和前端SDK分别创建安全的身份和权限,遵循权限最小化原则。
1. 创建供前端应用扮演的RAM角色
此角色是一个没有长期密钥的虚拟身份,专门用于被临时扮演以获取日志写入权限。
1.1 创建RAM角色
操作路径: 登录RAM控制台,在左侧导航栏,选择,单击创建角色。
配置说明:
信任主体类型:选择云账号。
信任主体名称:选择当前云账号或指定其他云账号。
单击确定,输入角色名称
sls-web-tracking。
1.2 创建仅允许写入日志的权限策略
此策略精确地限制了上述角色只能向指定的 Logstore 写入日志。
操作路径:在左侧导航栏,选择,单击创建权限策略。
配置说明:
使用脚本编辑模式,粘贴以下脚本,并将
<Project名称>、<Logstore名称>替换为实际的Project、Logstore名称。{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":[ "log:PostLogStoreLogs", "log:PutLogs" ], "Resource":[ "acs:log:*:*:project/<Project名称>/logstore/<Logstore名称>" ] } ] }单击确定,输入策略名称
post-logs-policy,完成创建。
1.3 为RAM角色授予日志写入权限
将上一步创建的写入权限赋予前端扮演的角色。
操作路径:在左侧导航栏,选择,单击目标角色名称,进入角色详情页,在权限管理模块单击新增授权。
配置说明:
在新增授权面板中,搜索并选中上一步创建的自定义权限策略(
sls-logstore-write-policy)。单击确认授权,完成权限绑定。
2. 创建供后端服务使用的RAM用户
此用户拥有一个长期 AccessKey,用于向 STS 服务发起扮演角色的请求。
2.1 创建RAM用户
操作路径: 登录RAM控制台,在左侧导航栏,选择,单击创建用户。
配置说明:
登录名称:仅支持英文字母、数字、半角句号(.)、短划线(-)和下划线(_),最多64个字符,如:
sls-token-service。访问方式:勾选使用永久 AccessKey 访问。
其余配置保持默认,单击确定,完成创建,并保存 AccessKey ID 和 AccessKey Secret信息。
AccessKey Secret 仅在创建时显示一次,不支持后续查询,请务必立即保存至安全位置。
2.2 为RAM用户授予角色扮演的权限
操作路径:单击目标用户名称,进入用户详情页,切换到权限管理页签,单击新增授权。
配置说明:
在权限策略模块,勾选
AliyunSTSAssumeRoleAccess策略。其余配置保持默认,单击确认新增授权,完成权限绑定。
小结:后端服务使用 RAM 用户(AK/SK)扮演 sls-web-tracking 角色,生成临时安全凭证返回给前端应用,WebTracking SDK 使用临时凭证安全上传日志。步骤二:搭建后端STS临时凭证服务
需搭建一个后端接口,用于接收前端的凭证请求,并安全地返回 STS 临时凭证,以下以Python + Flask 为例。
您可根据实际技术栈参考附录一:多语言STS示例,选择 Java、Node.js等其他语言实现。
1. 准备服务器环境
在实际部署时,您可以将调用STS服务的接口集成到自己的业务服务器中,而无需单独准备服务器,也可以将接口单独部署,只需确保该服务器满足如下要求:
前端应用可通过 HTTP(S) 访问该服务器。
安装Python3环境,推荐Python3.8及以上版本。
执行如下命令,安装调用阿里云STS服务接口所需的依赖库。
# 安装 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.22. 编写后端STS服务代码
创建一个HTTP接口 /get_sts_token,用于生成并返回STS临时凭证。
2.1 创建项目目录与文件
# 创建并进入项目目录
mkdir my_web_sample
cd my_web_sample
touch main.py2.2 编辑main.py文件
请将以下代码粘贴至 main.py 文件,并将 <YOUR_ROLE_ARN> 替换为RAM 角色 sls-web-tracking 对应的 ARN, <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__)
# ================== 用户配置区 ==================
# 替换为您的 RAM 角色 ARN,格式:acs:ram::${accountId}:role/${roleName}
role_arn_for_sls_upload = '<YOUR_ROLE_ARN>'
# 设置角色会话名称(建议唯一标识请求来源)
role_session_name = '<YOUR_ROLE_SESSION_NAME>' # 如:sls-web-session-001
# 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():
"""
接口:/get_sts_token
方法:GET
功能:调用 STS AssumeRole 接口获取临时安全令牌
返回:JSON 格式的 Credentials 对象
"""
# 初始化 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)
# 构造 AssumeRole 请求
assume_role_request = sts_20150401_models.AssumeRoleRequest(
role_arn=role_arn_for_sls_upload,
role_session_name=role_session_name,
)
# 调用 STS 获取临时凭证
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)
3. 启动后端服务
执行如下命令,使用步骤一中创建的RAM用户的访问密钥启动服务:
ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET>
python3 main.py4. 验证接口是否正常工作
发送测试请求:
curl http://<服务器公网IP地址>/get_sts_token成功响应示例:
{
"AccessKeyId": "STS.L4xxxxxx",
"AccessKeySecret": "Dcyyyyyyyy",
"Expiration": "2025-04-05T10:30:00Z",
"SecurityToken": "CAISzxxxxxxxxxxx..."
}
验证要点:
返回字段包含
AccessKeyId,AccessKeySecret,SecurityToken。AccessKeyId以STS.开头,表示是临时凭证。Expiration表示过期时间,应在合理范围内。
步骤三:前端集成WebTracking SDK
在前端应用(浏览器或小程序)中集成 SDK,并配置 STS 插件以实现安全授权和日志上报。完整示例工程请参见附录二:前端应用示例工程。
1. 安装SDK依赖
使用 npm 安装 WebTracking SDK 及其 STS 插件:
npm install --save @aliyun-sls/web-track-browser
npm install --save @aliyun-sls/web-sts-plugin2. 初始化 SDK 并配置 STS 身份验证
在前端项目中创建一个用于初始化日志采集器的 JavaScript 文件,例如index.js。该文件负责初始化 SlsTracker 实例,配置 STS 临时凭证插件。
2.1 引入核心模块
import SlsTracker from "@aliyun-sls/web-track-browser";
import createStsPlugin from "@aliyun-sls/web-sts-plugin";2.2 配置日志服务基础信息
请根据您的实际资源信息填写以下参数:
const opts = {
host: "${endpoint}", // 所在地域的服务入口。例如cn-hangzhou.log.aliyuncs.com
project: "${project}", // Project 名称
logstore: "${logstore}", // Logstore 名称
time: 10, // 发送日志的时间间隔,默认是10秒
count: 10, // 发送日志的数量大小,默认是10条
topic: "topic", // 自定义日志主题
source: "source",
tags: {
tags: "tags",
},
};2.3 配置STS插件以实现安全授权
为保障安全性,前端应用不应持有长期 AccessKey。推荐通过后端服务获取临时安全令牌(STS Token),并通过插件动态刷新。
const stsOpt = {
accessKeyId: "",
accessKeySecret: "",
securityToken: "",
// 刷新 STS Token 的异步函数
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.accessKeyId = credential.AccessKeyId;
stsOpt.accessKeySecret = credential.AccessKeySecret;
stsOpt.securityToken = credential.SecurityToken;
resolve();
} else {
reject("Wrong status code.");
}
}
};
}),
// (可选)自定义刷新频率,默认 5 分钟(300000ms)
// refreshSTSTokenInterval: 300000,
// (可选)设置 token 过期前多久提前刷新(单位毫秒)
// stsTokenFreshTime: undefined,
};2.4 初始化Tracker实例并启用STS插件
// 创建 tracker 实例
const tracker = new SlsTracker(opts);
// 创建并注册 sts 插件
const stsPlugin = createStsPlugin(stsOpt);
tracker.useStsPlugin(stsPlugin);
3. 在业务代码中上报日志
在需要追踪用户行为的地方,调用 tracker.send() 方法。
浏览器端
在 Web 页面,通过标准 DOM 事件绑定机制捕获用户行为,并发送自定义日志。
3.1 监听用户交互事件
示例:记录用户登录行为
document.getElementById("loginButton").addEventListener("click", () => {
const username = document.getElementById("username").value;
tracker.send({
eventType: "login",
username: username,
});
console.log("Login event tracked for:", username);
});3.2 在HTML中引用脚本
确保 JavaScript 文件被正确加载。建议使用模块化方式导入:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>用户行为监控示例</title>
</head>
<body>
<input type="text" id="username" placeholder="请输入用户名" />
<button id="loginButton">登录</button>
<!-- 使用模块化脚本 -->
<script type="module" src="/static/js/index.js"></script>
</body>
</html>小程序端
在小程序页面,通过事件绑定机制捕获用户的输入和操作行为,实现交互响应与日志上报。
3.1 绑定输入与点击事件
<!-- 待办事项页面:支持输入任务名称并添加 -->
<input placeholder="请输入任务名称" bindinput="onInput" />
<button bindtap="onAddTodo">Add Todo</button>3.2 JS 事件处理与日志上报
// 引入已初始化的 tracker 实例(建议全局单例管理)
const { tracker } = require('../../utils/tracker');
Page({
data: {
inputValue: ''
},
onInput(e) {
this.setData({ inputValue: e.detail.value });
},
onAddTodo() {
const todoTitle = this.data.inputValue.trim();
if (!todoTitle) return;
// 上报“添加待办”事件
tracker.send({
eventType: "add_todo",
title: todoTitle,
timestamp: Date.now(),
platform: "mini-program",
appId: my.getAppId ? my.getAppId() : wx.getAccountInfoSync().miniProgram.appId
});
console.log('Todo added and event tracked:', todoTitle);
// 其他业务逻辑...
this.setData({ inputValue: '' });
}
});4. 运行并测试应用
启动并访问前端页面,触发用户行为事件,使 WebTracking SDK 开始采集日志并上传。
浏览器端
启动前端服务,访问前端页面:
http://<服务器公网IP>。模拟用户操作(点击登录按钮)。
打开浏览器开发者工具(F12):
查看 Console 输出是否显示
Login event tracked for: xxx。在 Network 面板检查是否有成功发送到
cn-xxx.log.aliyuncs.com的 POST 请求。
小程序端
本文示例仅用于功能演示,在开发者工具中忽略域名合法性。小程序正式上线前,必须配置域名检查。
在支付宝开发者工具中单击右上角的编译
。预览小程序,模拟用户操作(在Todo页面单击“Add Todo”按钮)。
查看控制台输出日志,并确认网络请求中出现对
cn-xxx.log.aliyuncs.com的 POST 请求。
5. 验证日志上报
确认前端日志已通过安全链路成功写入阿里云日志服务的Logstore。
登录日志服务控制台。
在Project列表中,单击目标Project。
进入日志库页面,单击目标Logstore名称前的
展开目标Logstore。单击
,进入查询/分析页面。单击开启索引,在右侧弹窗中单击自动生成索引。
系统将自动识别日志结构并生成推荐字段配置,确认无误后单击确定。
开启索引后,建议等待约1分钟以确保索引生效,之后即可进行日志查询。
匿名直传模式
本方案通过开启WebTracking开关,开放Logstore的公网写入权限,允许前端直接通过SDK、HTTP请求等方式匿名上报日志。
严禁用于生产环境。
开启Web Tracking开关后,任何持有接入点信息的用户均可向该Logstore写入数据。
适用场景:仅限于无数据安全要求的开发、测试环境,用于快速验证日志上报链路。
步骤一:开启WebTracking开关
登录日志服务控制台。
在Project列表区域,单击目标Project。
在页签中,选择目标Logstore右侧的。
在Logstore属性页面,单击修改。
开启WebTracking开关,单击保存。
步骤二:配置匿名采集并上报日志
支持如下四种接入方式:
集成WebTracking SDK:在前端代码中引入WebTracking SDK,调用
send()方法发送结构化日志。适用于现代 Web 和小程序应用。HTTP GET请求:将日志数据拼接在 URL 参数中,通过 GET 请求直接上报。实现简单,适合调试或少量日志的轻量采集。
HTML标签(img):使用
<img>标签的src属性发起请求,日志信息编码在 URL 中。无需 JavaScript,天然支持跨域,适用于静态页面或邮件追踪等无 JS 环境。OpenAPI批量写入:通过 POST 请求调用 SLS OpenAPI,适合服务端集中上报大量数据。
WebTracking SDK
在匿名写入模式下,无需配置 STS 插件,直接初始化 SDK 即可。
安装依赖
# 浏览器端
npm install --save @aliyun-sls/web-track-browser
# 小程序端
npm install --save @aliyun-sls/web-track-mini配置日志服务基本信息
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对象上报日志
上传单条日志时,每条日志单独作为一个对象Object。上传多条日志时,数据结构是包含多个对象Object的数组Array。
单条日志上传
tracker.send({
eventType:'view_product',
productName: 'Tablet',
price: 500
})单条日志立即上传(time和count参数不生效):
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
}
])批量日志立即上传(time和count参数不生效):
tracker.sendBatchLogsImmediate([
{
eventType:'view_product',
productName: 'Tablet',
price: 500
},
{
eventType:'view_product',
productName: 'Laptop',
price: 1200
}
])HTTP GET请求
将日志数据作为URL参数,通过GET 请求直接发送至日志服务接收端点。
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)
通过在前端页面中嵌入一个不可见的 <img> 标签,利用浏览器自动加载图片的机制触发日志上报。
<!-- 采集自定义字段 -->
<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-Agent和Referer信息。为避免浏览器缓存,建议加入时间戳参数。
OpenAPI:批量写入日志
当需要上报大量日志时,可通过调用PutWebtracking - 通过WebTracking批量写入日志接口上传多条日志。
步骤三:验证日志上报
确认前端日志已成功写入阿里云日志服务的Logstore。
登录日志服务控制台。
在Project列表中,单击目标Project。
进入日志库页面,单击目标Logstore名称前的
展开目标Logstore。单击
,进入查询/分析页面。单击开启索引,在右侧弹窗中单击自动生成索引。
系统将自动识别日志结构并生成推荐字段配置,确认无误后单击确定。
开启索引后,建议等待约1分钟以确保索引生效,之后即可进行日志查询。
配额与限制
为保障服务稳定性,SLS WebTracking 在不同终端环境下对日志上报设置了合理的配额限制。
终端 | SDK | 单次请求最大数据量 | 单次请求最多日志条数 |
浏览器端 |
| 3 MB | 4,096 条 |
小程序端 |
| 10 MB | - |
小程序SDK支持:微信小程序/小游戏、支付宝小程序、字节跳动小程序、钉钉小程序、QQ小程序/小游戏、百度小程序。
小程序正式上线前,必须在小程序管理后台配置请求的域名合法性,将日志服务的 Endpoint(如
cn-hangzhou.log.aliyuncs.com)添加到 request 合法域名列表中。
计费说明
使用WebTracking 采集前端日志时,WebTracking 功能本身不收取额外费用,但由此产生的日志写入、存储与查询等操作可能会产生如下计费。
1. 计费模式选择
在创建 Logstore 时可选择不同的计费方式:
按写入数据量计费:适合需要对日志进行长期存储、分析加工及多场景消费的复合型使用场景。
按使用功能计费:适合需灵活控制成本的轻量级或阶段性使用场景。
2. 核心计费项
按写入数据量计费
原始写入数据量:主要费用来源,根据上传的未压缩原始日志大小(GB)计费。此费用已包含数据写入、索引、API 调用及首月(30天)热存储。
存储费用:日志存储超过30天后,会额外收取存储费。
按使用功能计费
索引流量:数据写入时,按未压缩的原始日志大小收取的一次性费用,是日志可查询的前提。
存储费用:从第一天开始,按压缩后的实际占用空间计费。
读写流量、读写次数、活跃Shard租用等。
常见问题
是否可以通过 CDN 方式引入 WebTracking SDK?
支持,适用于无法使用 npm 构建流程的轻量级前端项目、静态页面或快速验证场景。
版本滞后风险:当前 CDN 托管的最高版本为 0.3.5,功能可能落后于 npm 发布的最新版本。
引入方式:
在 HTML 文件的
<head>或<body>标签中添加以下脚本引用。<script src="https://g.alicdn.com/sls/sls-js-sdk/0.3.5/web-track-browser.js"></script>SDK 加载完成后,可通过全局对象
window.SLS_Tracker初始化 tracker 实例:if (window.SLS_Tracker) { const tracker = new SLS_Tracker({ host: 'your-project.cn-hangzhou.log.aliyuncs.com', project: 'your-project', logstore: 'your-logstore', time: 10, count: 10 }); }
相关文档
附录一:多语言STS示例
为方便不同技术栈的开发者快速搭建后端 STS 凭证服务,阿里云提供多种语言的开源示例程序,支持 Java、Node.js、PHP、Ruby 等主流语言。这些示例基于AssumeRole接口实现,用于向前端应用安全签发临时访问令牌。
示例项目地址:Java、Node.js、PHP、Ruby
使用说明:修改项目中的 config.json 配置文件,并根据对应语言的说明启动服务。
语言 | 端口 |
Java | 7080 |
Node.js | 3000 |
PHP | 8000 |
Ruby | 4567 |
> 修改