sls-query

SKILL.md

SLS 日志查询 Skill

常用场景快速索引

根据查询目的快速定位 logstore:

  • 用户登录/活跃 → login_log
  • 聊天消息 → msgsave
  • 金币变动 → coin_change_log
  • 游戏币变动 → chip_change_log
  • 游戏对局 → sls_game_log
  • API 请求 → http-extranet_api_info
  • HTTP 网关 → http-ex-access
  • TCP 网关 → connector_access
  • 内容审核/违规 → dirtyfilter-info
  • 风控事件 → risk-engine
  • 活动相关日志 → activity_server
  • 定时任务相关 → wespy-http-go-cron
  • 用户成长值日志 → sls_growth_log

重要规则

脚本路径(按优先级):

  1. ~/.claude/skills/act-sls-query/scripts/sls_cli.py(默认路径,Claude Code)
  2. ~/.cursor/rules/act-sls-query/scripts/sls_cli.py(Cursor)
  3. ~/.claude/skills/act-sls-query/scripts/sls_cli.py(Codex)

重要

  • Agent 调用时必须使用完整路径,不要使用相对路径
  • 默认使用 Claude Code 路径(~/.claude/skills/act-sls-query/scripts/sls_cli.py

核心原则

  • 先问再查,禁止盲查:信息不足时必须先向用户确认,不要猜测后盲目查询多个 logstore
  • 优先 CLI,避免写代码:使用 CLI 命令完成所有查询操作
  • 批量拉取用 query-all:需要拉取超过 500 条记录时,使用 query-all 命令自动分页,无需编写分页脚本
  • JSON 输出到 stdout:日志数据输出到 stdout(JSON 格式),状态信息和错误输出到 stderr
  • 注意查询时间范围:默认查询最近 1 小时,排查问题时注意根据实际情况调整时间范围
  • 区服判断:用户提到具体区服时使用 --region,未指定时使用配置文件中的 default_region,如用户未明确区服则询问

排查流程(必须严格遵守)

每次查询必须经过:信息收集 → 确认汇总 → 执行查询 → 超时兜底,四个阶段缺一不可。


第一步:信息收集(必填项检查)

收到排查请求后,必须对照以下清单逐项检查,4 项全部确认后才能进入下一步:

必填项 说明 缺失时处理
logstore 要查哪个日志库 根据「logstore 决策树」推断,无法确定则必须反问
区服 查哪个区服的数据 必须反问,禁止猜测或使用默认值
时间范围 问题发生的具体时间 必须反问,禁止使用默认 1h(容易查不到白跑)
查询条件 uid / act_id / device_id 等 至少一个过滤条件,否则必须反问

反问规则:

  • 缺少任意必填项 → 一次性列出所有缺失项,避免多轮追问
  • 4 项全部具备 → 进入第二步确认

反问模板:

查询日志前需要确认以下信息:
1. 📦 日志库:查哪个库?(如:活动日志 activity_server / 金币变动 coin_change_log / ...)
2. 🌐 区服:哪个区服?(如:华语服 C / 日服 J / ...)
3. ⏰ 时间范围:大概什么时间发生的?(如:今天 14:00 左右 / 最近 2 小时 / 2026-04-01 14:00~16:00)
4. 🔍 查询条件:uid / act_id / 其他关键信息?

第二步:确认汇总(执行前必须确认)

无论信息是用户一次性提供还是多轮补充的,执行查询前必须输出确认汇总,等待用户确认后再查询:

📋 查询确认:
- 日志库:activity_server
- 区服:华语服 (C)
- 时间范围:2026-04-01 14:00:00 ~ 2026-04-01 16:00:00
- 查询条件:uid: 12345

确认后开始查询,请回复"确认"或修改以上信息。

用户回复"确认"/"可以"/"查"等肯定词后,立即执行查询。 用户提出修改 → 更新对应项后重新输出确认汇总。


第三步:执行查询(带超时保护)

超时兜底规则:

每次执行 CLI 查询命令时,必须设置 5 分钟(300 秒)超时

timeout 300 ~/.claude/skills/act-sls-query/scripts/sls_cli.py --region C query \
  --logstore activity_server --query "* and uid: 12345" \
  --from "2026-04-01 14:00:00" --to "2026-04-01 16:00:00"

查询超时或无结果时的处理:

⏱️ 查询超时/无结果,可能原因:
1. 时间范围过大,数据量超出处理能力 → 建议缩小时间范围(如从 2h 缩到 30m)
2. 查询条件过于宽泛 → 建议增加过滤条件(如加上 act_id)
3. logstore 选择不对 → 该问题的日志可能记录在其他库中
4. 该时间段确实无匹配数据

请提供以下信息帮助进一步排查:
- 能否缩小时间范围?(精确到分钟最佳)
- 是否有其他过滤条件可以补充?
- 是否需要换一个日志库查询?

优化查询性能的原则:

  • 时间范围尽量精确:能用 30m 不用 1h,能用 1h 不用 24h
  • 必须带过滤条件:禁止 --query "*" 全量查询
  • 优先用 count 预估数据量:数据量大时先 count,再决定是否 query-all
  • query-all 大数据量场景:建议 --format jsonl + 重定向到文件,避免内存溢出

logstore 决策树

当用户未明确 logstore 但描述了问题场景时,按以下规则快速定位:

用户描述关键词 对应 logstore 直接查询
"登录"、"在线"、"活跃"、"版本" login_log
"金币"、"充值"、"钻石" coin_change_log
"游戏币"、"筹码"、"下注" chip_change_log
"对局"、"胜负"、"游戏记录" sls_game_log
"活动"、"act_id"、"活动参与"、"活动报错"、"活动异常" activity_server + http-extranet_api_info ✅ 两个库都查
"定时任务"、"cron"、"定时" wespy-http-go-cron
"成长值"、"等级"、"经验" sls_growth_log
"聊天"、"消息"、"发言" msgsave
"违规"、"封禁"、"审核" dirtyfilter-info
"风控"、"异常检测" risk-engine
"接口报错"、"API"、"500" http-extranet_api_info
"网关"、"超时"、"请求慢" http-ex-access
无法从描述判断 ❌ 必须反问

活动相关查询特殊规则

当判断为活动相关问题(提到"活动"、"act_id"、活动名称等)且用户未指定具体 logstore 时:

  1. 默认同时查询两个库activity_server(活动业务日志)+ http-extranet_api_info(API 请求日志)
  2. 先查 activity_server 定位活动业务逻辑问题,再查 http-extranet_api_info 看接口层是否有报错
  3. 如果两个库都没有明显线索,再反问用户补充信息

完整示例

❌ 错误做法(盲查 + 无确认 + 无超时):

用户:帮我查一下 uid 12345 的活动问题
Agent:(不确认,直接查 activity_server → 超时 → 查 http-extranet_api_info → 又超时 → 10 分钟过去了...)

✅ 正确做法:

用户:帮我查一下 uid 12345 的活动问题
Agent:查询前确认以下信息:
1. 🌐 区服:哪个区服?
2. ⏰ 时间范围:大概什么时间发生的?

用户:华语服,今天下午 2 点左右
Agent:
📋 查询确认:
- 日志库:activity_server + http-extranet_api_info
- 区服:华语服 (C)
- 时间范围:2026-04-07 14:00:00 ~ 2026-04-07 15:00:00
- 查询条件:uid: 12345

确认后开始查询,请回复"确认"或修改以上信息。

用户:确认
Agent:(执行 timeout 300 查询...)

配置说明

配置文件 ~/.sls_config.json

{
  "default_region": "C",
  "access_key_id": "<your-access-key-id>",
  "access_key_secret": "<your-access-key-secret>"
}
  • default_region:默认区服(不指定 --region 时使用)
  • 也可通过环境变量配置 AK/SK:SLS_ACCESS_KEY_IDSLS_ACCESS_KEY_SECRET
  • 优先级:--region > --endpoint/--project > 环境变量 > 配置文件 default_region > 配置文件 endpoint/project

快速参考

操作 命令 示例
查询日志 query sls_cli.py --region C query --logstore login_log --query "* and uid: 123" --from 24h
拉取全部 query-all sls_cli.py --region A query-all --logstore coin_change_log --query "* and type: 2607" --from "2026-02-09 00:00:00" --to "2026-02-09 14:30:00"
统计数量 count sls_cli.py --region 土语服 count --logstore login_log --query "* and uid: 123" --from 7d
列出 logstore list-logstores sls_cli.py list-logstores
列出区服 list-regions sls_cli.py list-regions

CLI 命令详细用法

全局参数

  • --region:区服代码或名称(如 C/华语服/J/日服),自动映射到对应的 endpoint 和 project。优先级最高。
  • --dev:查询测试服环境,自动在 project 名后追加 -dev(如 weplay-sgpweplay-sgp-dev
  • --endpoint:手动指定 SLS endpoint(--region 优先)
  • --project:手动指定 SLS project(--region 优先)

query — 查询日志记录

~/.claude/skills/act-sls-query/scripts/sls_cli.py [--region <区服>] query \
  --logstore <logstore名称> \
  --query "<SLS查询语句>" \
  [--from <起始时间>] \
  [--to <结束时间>] \
  [--limit <最大返回条数>] \
  [--offset <分页偏移量>] \
  [--reverse]

参数说明

  • --logstore (required):LogStore 名称,见下方 logstore 列表
  • --query (required):SLS 查询语句,如 "* and uid: 123"
  • --from:起始时间(默认 1h
    • 相对时间:15m1h24h7d30d
    • 日期字符串:2024-01-012024-01-01 00:00:00
    • Unix 时间戳:1704067200
  • --to:结束时间(默认 now),格式同 --from
  • --limit:最大返回条数(默认 500)
  • --offset:分页偏移量(默认 0)
  • --reverse:倒序排列(最新的在前)

query-all — 自动分页拉取全部记录

~/.claude/skills/act-sls-query/scripts/sls_cli.py [--region <区服>] query-all \
  --logstore <logstore名称> \
  --query "<SLS查询语句>" \
  [--from <起始时间>] \
  [--to <结束时间>] \
  [--page-size <每页记录数>] \
  [--format json|jsonl] \
  [--reverse]

参数说明

  • --logstore (required):LogStore 名称
  • --query (required):SLS 查询语句
  • --from:起始时间(默认 1h),格式同 query 命令
  • --to:结束时间(默认 now
  • --page-size:每页记录数(默认 500),内部自动循环分页直到拉完
  • --format:输出格式,json(默认,JSON 数组)或 jsonl(每行一个 JSON 对象,适合大数据量管道处理)
  • --reverse:倒序排列

适用场景:需要拉取超过 500 条记录的批量分析,无需手动编写分页循环。内置自动重试(incomplete 时最多重试 3 次)。

示例

# 拉取某天全部金币入场记录(JSON 数组)
sls_cli.py --region A query-all --logstore coin_change_log \
  --query "* and type: 2607 and subtype: 2005" \
  --from "2026-02-09 00:00:00" --to "2026-02-09 14:30:00"

# 拉取并以 JSONL 格式输出(适合 jq 管道处理)
sls_cli.py --region A query-all --logstore chip_change_log \
  --query "* and type: 2607" \
  --from "2026-02-09 00:00:00" --to "2026-02-09 14:30:00" \
  --format jsonl

# 保存到文件
sls_cli.py --region A query-all --logstore sls_game_log \
  --query "* and game_type: 2005" \
  --from "2026-02-09 00:00:00" --to "2026-02-09 17:00:00" \
  --format jsonl > /tmp/game_logs.jsonl

count — 统计日志数量

~/.claude/skills/act-sls-query/scripts/sls_cli.py [--region <区服>] count \
  --logstore <logstore名称> \
  --query "<SLS查询语句>" \
  [--from <起始时间>] \
  [--to <结束时间>]

内部自动在 query 后追加 | select count(*) as total,返回 {"total": N}

list-logstores — 列出已知 logstore

~/.claude/skills/act-sls-query/scripts/sls_cli.py list-logstores

列出内置的 logstore 列表,包含名称、说明和常用字段。

list-regions — 列出可用区服

~/.claude/skills/act-sls-query/scripts/sls_cli.py list-regions

列出所有可用区服及其代码、项目名和别名。

区服代码

支持标准代码和中文别名,使用 --region 参数指定:

代码 名称 Project 别名
C 华语服 weplay-sgp 华语、中国、新加坡
T 泰服 weplay-bkk 泰国、泰语服
M 马尼服 weplay-mas 马来西亚、马来服
P 菲律宾服 weplay-phl 菲律宾
V 越南服 weplay-vnm 越南
J 日服 weplay-tky 日本、日语服
K 韩服 weplay-sel 韩国
U 美服 weplay-sv 美国
R 俄语服 weplay-rus 俄罗斯、俄服
B 葡语服 weplay-br 葡萄牙、葡萄牙服
S 西语服 weplay-va 西班牙
F 法语服 weplay-par 法国
G 德语服 weplay-de 德国
Y 意语服 weplay-it 意大利
A 阿语服 weplay-fra 阿拉伯、阿语
Q 土耳其服 weplay-tur 土语服、土耳其
I 印度服 weplay-in 印度
O JK服 jackaroo-ar jk、jackaroo
N 巴基斯坦服 weplay-pk 巴基斯坦、乌语服

使用示例--region C--region 华语服--region 土语服 均可。

已知 LogStore 列表

LogStore 说明 常用字段
login_log 登录/活跃记录 uid, device_id, ip, platform, log_time, app_version, country, province
msgsave 聊天消息 uid, content, target_id, msg_type
coin_change_log 金币变动 uid, coin, type, subtype, remain_coin, log_time, device_id
chip_change_log 游戏币变动 uid, chip, type, subtype, remain_chip, log_time, device_id
sls_game_log 游戏记录 uid, rid, game_type, is_win, bet_level, start_time, end_time
activity_data 活动事件 act_id, uid, key
risk-engine 风控日志 uid, device_id, risk_source
dirtyfilter-info 内容过滤 uid, content, channel, risk_level, label, sub_label, scene, rid
external_info 短信日志 (prod)
http-extranet_api_info API 服务日志 method, path, status, response_time, uid
http-ex-access HTTP 网关日志 bytes_sent, client_ip, http_code, method, uri, response_ms, uid, ua, referer, protocol, forward_ip
connector_access TCP 网关日志 uid, command, type, response_time, bytes_sent, c_body_size, rid, version
tmproom 临时房间信息
clientupload 客户端上报
client_ping 客户端心跳 uid, device_name
sls_user_title_log 用户称号 uid
record 杂项记录 category, uid, content, shumei_device_id, scene_type, labels
activity_server 活动相关日志 act_id, uid
wespy-http-go-cron 定时任务相关 uid
sls_growth_log 用户成长值日志 uid, old_value, new_value

SLS 查询语法参考

基础语法

# 全量查询
*

# AND 条件
* and uid: 123

# 多条件 AND
* and uid: 123 and platform: android

# OR 条件
* and (type: 1 or type: 2)

# NOT 条件
* and uid: 123 not platform: ios

# 字符串精确匹配(带引号)
* and content: "hello world"

# 数值比较(需要 SQL 子句)
* | select * where coin > 100

SQL 分析子句

SLS 支持在查询后追加 | select ... 进行 SQL 分析:

# 统计总数
* and uid: 123 | select count(*) as total

# 求和
* and uid: 123 | select sum(coin) as total_coin

# 分组统计
* and uid: 123 | select type, count(*) as cnt group by type

# 条件过滤 + 统计
* and uid: 123 | select sum(coin) as total where coin < 0

# 去重计数
* and uid: 123 | select count(distinct device_id) as device_count

# 排序 + 分页
* and uid: 123 | select * order by __time__ desc limit 0, 100

# 时间聚合
* and uid: 123 | select date_format(__time__, '%Y-%m-%d') as day, count(*) as cnt group by day order by day

常用内置字段

  • __time__:日志时间(Unix 时间戳)
  • __source__:日志来源
  • __topic__:日志 topic

常用查询模板

登录日志 (login_log)

# 查询用户最近登录记录
sls_cli.py query --logstore login_log --query "* and uid: 123" --from 7d --reverse

# 查询某设备的登录记录
sls_cli.py query --logstore login_log --query "* and device_id: abc123" --from 24h

# 统计用户某段时间登录次数
sls_cli.py count --logstore login_log --query "* and uid: 123" --from 30d

# 查询某国家的登录分布
sls_cli.py query --logstore login_log --query "* and uid: 123 | select country, count(*) as cnt group by country" --from 30d

金币变动 (coin_change_log)

# 查询用户金币变动
sls_cli.py query --logstore coin_change_log --query "* and uid: 123" --from 24h --reverse

# 查询特定类型的金币变动
sls_cli.py query --logstore coin_change_log --query "* and uid: 123 and type: 1" --from 7d

# 统计用户金币总收入
sls_cli.py query --logstore coin_change_log --query "* and uid: 123 | select sum(coin) as total where coin > 0" --from 30d

# 统计用户金币变动次数(按类型分组)
sls_cli.py query --logstore coin_change_log --query "* and uid: 123 | select type, subtype, count(*) as cnt, sum(coin) as total group by type, subtype" --from 7d

游戏币变动 (chip_change_log)

# 查询用户游戏币变动
sls_cli.py query --logstore chip_change_log --query "* and uid: 123" --from 24h --reverse

# 拉取某天全部游戏币入场记录
sls_cli.py query-all --logstore chip_change_log --query "* and type: 2607" --from "2026-02-09 00:00:00" --to "2026-02-09 14:30:00"

# 统计用户游戏币变动(按类型分组)
sls_cli.py query --logstore chip_change_log --query "* and uid: 123 | select type, count(*) as cnt, sum(chip) as total group by type" --from 7d

聊天消息 (msgsave)

# 查询用户聊天记录
sls_cli.py query --logstore msgsave --query "* and uid: 123" --from 24h --reverse

# 查询两个用户之间的聊天
sls_cli.py query --logstore msgsave --query "* and uid: 123 and target_id: 456" --from 7d

游戏记录 (sls_game_log)

# 查询用户游戏记录
sls_cli.py query --logstore sls_game_log --query "* and uid: 123" --from 7d --reverse

# 查询某房间的游戏记录
sls_cli.py query --logstore sls_game_log --query "* and rid: 456" --from 24h

# 统计用户胜率
sls_cli.py query --logstore sls_game_log --query "* and uid: 123 | select is_win, count(*) as cnt group by is_win" --from 30d

活动数据 (activity_data)

# 查询用户的活动参与记录
sls_cli.py query --logstore activity_data --query "* and uid: 123 and act_id: 100" --from 7d

# 统计活动参与人数
sls_cli.py query --logstore activity_data --query "* and act_id: 100 | select count(distinct uid) as user_count" --from 7d

内容过滤 (dirtyfilter-info)

# 查询用户的违规记录
sls_cli.py query --logstore dirtyfilter-info --query '* and uid: 123 and (risk_level: REVIEW or risk_level: REJECT)' --from 7d

# 查询高风险内容
sls_cli.py query --logstore dirtyfilter-info --query '* and risk_level: REJECT and "check result record"' --from 24h --reverse

# 按标签统计违规类型
sls_cli.py query --logstore dirtyfilter-info --query '* and uid: 123 and risk_level: REJECT | select label, count(*) as cnt group by label' --from 30d

风控日志 (risk-engine)

# 查询用户风控事件
sls_cli.py query --logstore risk-engine --query "* and uid: 123" --from 7d

# 查询设备的风控事件
sls_cli.py query --logstore risk-engine --query "* and device_id: abc123" --from 7d

杂项记录 (record)

# 查询特定分类的记录
sls_cli.py query --logstore record --query "* and category: bottle and uid: 123" --from 7d

# 查询数美风控事件
sls_cli.py query --logstore record --query "* and category: shumei_risk and uid: 123" --from 7d

注意事项

  1. 时间范围:默认查询最近 1 小时,排查历史问题时记得调整 --from 参数
  2. 返回条数query 默认最多返回 500 条,可通过 --limit 调整;需要拉取全部数据时使用 query-all 命令自动分页
  3. 查询完整性queryquery-all 均内置 incomplete 自动重试(最多 3 次),无需手动处理
  4. 批量数据分析:优先使用 query-all 命令直接拉取全部数据,避免手动编写分页脚本。大数据量场景建议使用 --format jsonl 输出,便于管道处理
  5. 金币 vs 游戏币:金币变动在 coin_change_log,游戏币变动在 chip_change_log,两者是不同的 logstore,字段也不同(coin vs chip)
  6. logstore 名称:注意 dev 和 prod 环境的 logstore 可能不同(如短信日志在 dev 用 http-extranet_api_info,prod 用 external_info
  7. SQL 子句:使用 | select ... 时,统计结果可能需要更长时间,建议缩小时间范围
Installs
2
First Seen
Apr 13, 2026