上报接口#
LogTap 的客户端 SDK(Browser/Node、Go、Flutter)统一使用如下 HTTP 接口与 JSON 数据模型进行「日志」与「埋点/事件」上报。没有 SDK 的语言直接按本文协议调用 HTTP 即可。
基本约定#
- Base URL:你的 LogTap 网关地址,例如
http://localhost:8080 - Project ID:项目 ID(控制台项目页可见),作为路径参数
/api/:projectId/... - 鉴权(设置
AUTH_SECRET后强制):上报必须携带项目 Key,以下三种方式任选:X-Project-Key: pk_...Authorization: Bearer pk_...- Sentry SDK 的
X-Sentry-Auth(sentry_key=...)
- 批量:同一路径支持「单条对象」或「JSON 数组」
- 压缩:支持
Content-Encoding: gzip - 成功响应:
202 Accepted(网关只做校验和入队,写库由消费者异步完成)
1. 结构化日志#
端点:POST /api/:projectId/logs/
{
"level": "info",
"message": "hello",
"timestamp": "2025-01-01T00:00:00Z",
"device_id": "d1",
"trace_id": "t1",
"span_id": "s1",
"fields": { "k": "v" },
"tags": { "env": "prod" },
"user": { "id": "u1" },
"contexts": { "app": { "version": "1.2.3" } }
}字段说明:
message:必填level:建议值debug / info / warn / error / fatal,为空时服务端默认infotimestamp:RFC3339;不传则服务端补当前时间(UTC)user.id:用于用户去重口径(DAU/MAU、漏斗等);不传时回退到device_idfields:自定义结构化字段,建议把业务维度放这里tags/contexts:标签与应用上下文,随日志入库可在控制台过滤
批量上报示例(同一路径,JSON 数组):
[
{ "level": "info", "message": "hello-1", "user": { "id": "u1" }, "fields": { "k": "v1" } },
{ "level": "info", "message": "hello-2", "user": { "id": "u1" }, "fields": { "k": "v2" } }
]2. 埋点/事件#
端点:POST /api/:projectId/track/
{
"name": "signup",
"timestamp": "2025-01-01T00:00:00Z",
"user": { "id": "u1" },
"device_id": "d1",
"properties": { "plan": "pro", "ab": "b" }
}name:事件名,必填properties:事件属性,用于漏斗过滤与属性分布分析
服务端落库规则:事件写入 logs 表(level = "event",message = name,fields = properties),因此事件分析只统计 level="event" 的记录,不会被普通日志污染。
批量上报示例:
[
{ "name": "signup", "user": { "id": "u1" }, "properties": { "plan": "pro" } },
{ "name": "purchase", "user": { "id": "u1" }, "properties": { "sku": "s1" } }
]3. 检索与查询#
- 日志与事件查询、关键词全文检索、时序聚合、漏斗与留存分析均通过控制台完成
- Sentry 错误上报走独立协议,见Sentry 兼容
建议#
- 「日志」与「埋点事件」分开上报:日志走
/logs/,埋点走/track/ - 高频场景优先使用批量数组 + gzip,减少请求数与网络开销
- 把业务维度放进
fields/properties,控制台的过滤与漏斗都基于结构化字段