FlareLogAPI 文档

FlareLog 是一个轻量级日志接收与查询服务, 基于 Cloudflare Workers + D1 构建。

认证

所有 /api/* 接口均需认证。支持两种方式 (任选其一):

方式一: Authorization Header (推荐)

Authorization: Bearer <API_KEY>

方式二: X-API-Key Header

X-API-Key: <API_KEY>

未认证或 Key 错误时返回:

HTTP/1.1 401 Unauthorized

{
  "success": false,
  "error": "Unauthorized"
}

限流

写入接口有基于 IP 的频率限制:

接口 限制
POST /api/logs 60 次/分钟
POST /api/logs/batch 20 次/分钟

每次请求都会返回以下响应头, 可据此调整调用频率:

响应头 说明
X-RateLimit-Limit 时间窗口内最大请求数
X-RateLimit-Remaining 剩余可用请求数
X-RateLimit-Reset 限流窗口重置时间 (Unix 时间戳, 秒)

触发限流时返回:

HTTP/1.1 429 Too Many Requests
Retry-After: 30

{
  "success": false,
  "error": "Too many requests, please try again later"
}

统一响应格式

所有接口均返回 JSON, 遵循统一结构:

成功

{
  "success": true,
  "data": { ... }
}

失败

{
  "success": false,
  "error": "错误描述信息"
}

1. 服务信息

GET / 无需认证

获取服务名称和版本号。

响应示例

{
  "name": "FlareLog",
  "version": "0.2.0",
  "description": "Lightweight log service on Cloudflare Workers + D1"
}

2. 写入单条日志

POST /api/logs 需认证

请求头

Header
Content-Type application/json
Authorization Bearer <API_KEY>

请求体

字段 类型 必填 说明
service string 服务名称, 最长 128 字符
message string 日志消息, 最长 65536 字符
level string debug / info / warn / error, 默认 info
timestamp string 日志时间 (ISO 8601), 缺省使用服务器当前时间
trace_id string 链路追踪 ID, 最长 128 字符
metadata object 附加元数据, 必须是 JSON 对象, 序列化后最长 65536 字符
注意: level 传入无效值时不会报错, 会自动降级为 info

请求示例

{
  "level": "error",
  "service": "api-gateway",
  "message": "Connection timeout to database",
  "timestamp": "2025-04-30T10:00:00.000Z",
  "trace_id": "abc-123-def",
  "metadata": {
    "host": "db-primary",
    "port": 5432,
    "retry_count": 3
  }
}

成功响应 (201)

{
  "success": true,
  "data": {
    "id": 1
  }
}

id 为日志的唯一标识, 可用于后续查询和删除。

3. 批量写入日志

POST /api/logs/batch 需认证

批量写入多条日志, 在同一事务中执行, 保证原子性 (全部成功或全部失败)。请求体最大 5MB。

请求体

字段 类型 必填 说明
logs LogEntry[] 日志数组, 1-100 条

每条 LogEntry 的字段与单条接口相同。

请求示例

{
  "logs": [
    {
      "level": "info",
      "service": "auth-service",
      "message": "User login successful",
      "trace_id": "req-001"
    },
    {
      "level": "warn",
      "service": "auth-service",
      "message": "Rate limit approaching",
      "trace_id": "req-001"
    },
    {
      "level": "error",
      "service": "db-service",
      "message": "Query execution failed",
      "trace_id": "req-002",
      "metadata": {
        "query": "SELECT * FROM users WHERE id = ?",
        "error_code": "SQLITE_BUSY"
      }
    }
  ]
}

成功响应 (201)

{
  "success": true,
  "data": {
    "inserted": 3,
    "ids": [2, 3, 4]
  }
}

校验失败示例 (400)

{
  "success": false,
  "error": "logs[2]: service is required and must be a string"
}
错误信息中会标注具体是数组中第几条 (从 0 开始) 校验失败。

4. 查询日志列表

GET /api/logs 需认证

查询参数

参数 类型 默认值 说明
level string - 按单个级别过滤: debug / info / warn / error
levels string - 按多个级别过滤, 逗号分隔, 如 error,warn
service string - 按服务名称精确匹配
trace_id string - 按链路追踪 ID 精确匹配
message string - 消息内容模糊搜索 (包含即匹配)
start_time string - 起始时间 (ISO 8601, 包含边界)
end_time string - 结束时间 (ISO 8601, 包含边界)
limit number 50 每页条数, 范围 1-200
offset number 0 分页偏移量
sort string timestamp 排序字段: timestampcreated_at
order string desc 排序方向: ascdesc
levellevels 可以同时使用, 结果会自动合并去重。

请求示例

GET /api/logs?level=error&service=api-gateway&limit=20&offset=0

成功响应

{
  "success": true,
  "data": {
    "data": [
      {
        "id": 1,
        "level": "error",
        "service": "api-gateway",
        "message": "Connection timeout to database",
        "timestamp": "2025-04-30T10:00:00.000Z",
        "trace_id": "abc-123-def",
        "metadata": {
          "host": "db-primary",
          "port": 5432,
          "retry_count": 3
        },
        "created_at": "2025-04-30T10:00:01.000Z"
      }
    ],
    "total": 42,
    "limit": 20,
    "offset": 0,
    "has_more": true
  }
}

分页说明

字段 说明
total 符合条件的日志总数
limit 当前页大小
offset 当前偏移量
has_more 是否还有更多数据

翻页公式: offset += limit, 直到 has_morefalse

5. 查询单条日志

GET /api/logs/:id 需认证

路径参数

参数 类型 说明
id number 日志 ID (写入时返回)

成功响应

{
  "success": true,
  "data": {
    "id": 1,
    "level": "error",
    "service": "api-gateway",
    "message": "Connection timeout to database",
    "timestamp": "2025-04-30T10:00:00.000Z",
    "trace_id": "abc-123-def",
    "metadata": {
      "host": "db-primary",
      "port": 5432
    },
    "created_at": "2025-04-30T10:00:01.000Z"
  }
}

6. 删除单条日志

DELETE /api/logs/:id 需认证

路径参数

参数 类型 说明
id number 日志 ID

成功响应

{
  "success": true,
  "data": {
    "deleted": 1
  }
}

deleted 为实际删除的条数 (0 或 1)。

7. 批量删除日志

DELETE /api/logs 需认证

按条件批量删除日志, 至少需要提供一个参数, 以防误操作清空所有数据。

查询参数

参数 类型 必填 说明
service string 否* 按服务名称删除
before string 否* 删除该时间之前的日志 (ISO 8601)
*两个参数至少提供一个, 可同时使用 (取 AND 条件)。

请求示例

DELETE /api/logs?service=api-gateway&before=2025-04-01T00:00:00.000Z

含义: 删除 api-gateway 服务在 2025-04-01 之前的所有日志。

成功响应

{
  "success": true,
  "data": {
    "deleted": 15
  }
}

数据结构

LogEntry (写入时的日志条目)

字段 类型 必填 说明
service string 服务名称, 最长 128 字符
message string 日志消息, 最长 65536 字符
level string debug / info / warn / error, 默认 info
timestamp string ISO 8601 格式, 默认服务器当前时间
trace_id string 链路追踪 ID, 最长 128 字符
metadata object JSON 对象, 序列化后最长 65536 字符

StoredLog (查询返回的日志条目)

字段 类型 说明
id number 日志唯一 ID
level string 日志级别
service string 服务名称
message string 日志消息
timestamp string 日志时间 (调用方指定或自动生成)
trace_id string | null 链路追踪 ID
metadata object | null 附加元数据
created_at string 日志入库时间 (服务器生成)
timestamp 是日志事件发生的时间 (由调用方指定), created_at 是日志写入数据库的时间 (服务器自动生成)。两者可能不同。

错误码参考

状态码 含义 常见原因
400 请求参数错误 缺少必填字段, 字段类型错误, 参数格式无效
401 未认证 未提供 API Key, Key 格式错误, Key 不匹配
404 资源不存在 查询/删除的日志 ID 不存在
413 请求体过大 单条超过 1MB, 批量超过 5MB
415 Content-Type 错误 未设置 application/json
429 请求频率超限 超过限流阈值, 参见 Retry-After 响应头
500 服务器内部错误 数据库操作失败等, 可重试

最佳实践

日志写入

  1. 使用批量接口: 需要写入多条日志时, 优先使用 POST /api/logs/batch, 减少网络开销
  2. 指定 timestamp: 建议在写入时明确指定 timestamp, 避免因网络延迟导致时间偏差
  3. 利用 trace_id: 为同一请求链路上的日志设置相同的 trace_id, 方便后续关联查询
  4. 合理使用 metadata: 将结构化信息放入 metadata (如错误码、耗时、请求参数等), 而非拼入 message

日志查询

  1. 缩小查询范围: 始终指定 start_time / end_time, 减少扫描数据量, 提升查询速度
  2. 使用 has_more 翻页: 通过 has_more 字段判断是否继续请求下一页, 而非自行计算
  3. 按需选择排序字段: timestamp 按日志事件时间排序, created_at 按入库时间排序

日志清理

  1. 定期清理: 使用 DELETE /api/logs?before=<date> 定期清理过期日志, 控制 D1 存储用量
  2. 先查后删: 不确定数据量时, 可先 GET /api/logs 查看总数, 再执行删除

调用示例 (curl)

# 写入单条日志
curl -X POST https://your-worker.workers.dev/api/logs \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-api-key" \
  -d '{"level":"error","service":"my-app","message":"Something went wrong"}'

# 查询最近错误日志
curl "https://your-worker.workers.dev/api/logs?level=error&limit=10" \
  -H "Authorization: Bearer your-api-key"

# 按 trace_id 关联查询
curl "https://your-worker.workers.dev/api/logs?trace_id=req-001" \
  -H "Authorization: Bearer your-api-key"

# 清理 30 天前的日志
curl -X DELETE "https://your-worker.workers.dev/api/logs?before=2025-03-31T00:00:00.000Z" \
  -H "Authorization: Bearer your-api-key"