Token导航 LogoToken导航TokenDH.com
研究检索需要联网github未标认证来源可访问许可证需确认审计异常

loki-log-queryloki 日志查询

Agent Skill

loki-log-query 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

256

周安装

11

GitHub Stars

11

下载量

90
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:loki-log-query(loki 日志查询)
来源仓库:https://github.com/xu-cell/ai-engineering-init
仓库路径:skills/loki-log-query
安装命令:
npx skills add https://github.com/xu-cell/ai-engineering-init --skill loki-log-query
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/xu-cell/ai-engineering-init --skill loki-log-query

简介

loki-log-query 用于查找、检索和筛选相关信息。

  • 适合在 Codex、Claude、Cursor、Gemini CLI 中根据关键词、任务场景快速定位候选结果。
  • 通过 npx skills add 命令从指定 GitHub 仓库安装使用。
  • 安装前需确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。
  • 适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

SKILL.md

Loki 日志查询技能

概述

通过 Grafana Loki API 查询线上日志。支持:

  1. 多环境管理:5 个 Grafana 日志服务,按需切换
  2. traceId 查询:通过日志ID获取完整请求链路
  3. 接口路径查询:通过 API 接口路径查询相关日志
  4. 关键词搜索:错误信息、类名、自定义关键词

多环境配置

配置文件:.claude/skills/loki-log-query/environments.json

环境列表

环境别名名称URL快捷词
test13测试13(主测试环境)https://test13.xnzn.net/grafanatest13, 13
monitor-testMonitor 测试环境https://monitor-test.xnzn.net/grafanamtest
monitor-devMonitor 开发环境https://monitor-dev.xnzn.net/grafanamdev, dev
monitor02-devMonitor02 开发环境https://monitor02-dev.xnzn.net/grafanam02, monitor02
monitor-tyy-devMonitor 体验园开发环境https://monitor-tyy-dev.xnzn.net/grafanatyy, 体验园

环境匹配规则

用户说的话 → 匹配环境:

  • "查 test13 的日志" → test13
  • "去 monitor-dev 查" → monitor-dev
  • "切到体验园" → monitor-tyy-dev
  • "去 m02 查一下" → monitor02-dev
  • 未指定环境 → 使用 active 字段指定的默认环境

读取配置

SKILL_DIR="$CLAUDE_PROJECT_DIR/.claude/skills/loki-log-query"
ENV_FILE="${SKILL_DIR}/environments.json"

# 读取指定环境(参数: 环境别名)
read_env() {
  local ENV_KEY="${1:-$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['active'])")}"
  GRAFANA_URL=$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['environments']['${ENV_KEY}']['url'])")
  TOKEN=$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['environments']['${ENV_KEY}']['token'])")
  API="${GRAFANA_URL}/api/datasources/proxy/uid/loki/loki/api/v1"
  echo "Environment: ${ENV_KEY} → ${GRAFANA_URL}"
}

# 通过别名查找环境 key
find_env() {
  python3 -c "
import json
data = json.load(open('${ENV_FILE}'))
alias = '${1}'.lower()
for key, env in data['environments'].items():
    if alias == key or alias in env.get('aliases', []):
        print(key)
        break
else:
    print(data['active'])
"
}

切换活跃环境

# 切换默认环境为 monitor-dev
python3 -c "
import json
data = json.load(open('${ENV_FILE}'))
data['active'] = 'monitor-dev'
json.dump(data, open('${ENV_FILE}', 'w'), indent=2, ensure_ascii=False)
print('Switched to:', data['active'])
"

更新 Token

# 为某个环境设置 Token
python3 -c "
import json
data = json.load(open('${ENV_FILE}'))
data['environments']['monitor-dev']['token'] = 'glsa_新的token值'
json.dump(data, open('${ENV_FILE}', 'w'), indent=2, ensure_ascii=False)
print('Token updated for monitor-dev')
"

API 基础

项目
数据源Loki(uid: loki
API 路径{GRAFANA_URL}/api/datasources/proxy/uid/loki/loki/api/v1/query_range
认证Authorization: Bearer {TOKEN}
默认标签app="yunshitang"
重要:Loki API 必须通过 Grafana datasource proxy 访问,直接 /loki/api/v1/ 会返回 404。 查询时不限 project 标签({app="yunshitang"}),可覆盖该 Grafana 下所有环境。

日志格式

2026-03-07 09:16:53.039,bcf6d955-fa26-45a5-9628-748f7ac4eed2,,,  INFO 1 --- [线程名] 类名 : 行号 : 消息内容
位置字段示例
第1段时间戳2026-03-07 09:16:53.039
第2段traceIdbcf6d955-fa26-45a5-9628-748f7ac4eed2a53dd0b0cc62bf4a79a63e77444f6f3f
第3段商户ID553722740746489856
第4段用户ID553723188689768448
第5段日志内容INFO 1 --- [thread] Class: 123: msg
traceId 可能是 UUID 格式(带横线)或 32位hex(不带横线),都支持。

查询场景

场景 1:按 traceId 查完整链路(最常用)

用户说:"用 a53dd0b0cc62bf4a79a63e77444f6f3f 查日志"

TRACE_ID="a53dd0b0cc62bf4a79a63e77444f6f3f"
END=$(date +%s)000000000
START=$(( $(date +%s) - 21600 ))000000000  # 最近6小时

curl -s "${API}/query_range" \
  -H "Authorization: Bearer ${TOKEN}" \
  --data-urlencode "query={app=\"yunshitang\"} |= \"${TRACE_ID}\"" \
  --data-urlencode "start=${START}" \
  --data-urlencode "end=${END}" \
  --data-urlencode "limit=500" \
  --data-urlencode "direction=forward" \
  | python3 -c "
import sys, json
data = json.load(sys.stdin)
if data.get('status') == 'success':
    for stream in data['data']['result']:
        labels = stream.get('stream', {})
        print(f'--- {labels.get(\"app\",\"?\")}/{labels.get(\"project\",\"?\")} ---')
        for ts, line in stream['values']:
            print(line)
else:
    print('Error:', data)
"

场景 2:按接口路径查日志

用户说:"查 /security/summary/order/mealtime/classify/page 这个接口的日志"

接口路径出现在请求日志的 RequestLoggingFilter 中(>>> POST /xxx>>> GET /xxx)。

API_PATH="/security/summary/order/mealtime/classify/page"
END=$(date +%s)000000000
START=$(( $(date +%s) - 21600 ))000000000  # 最近6小时

curl -s "${API}/query_range" \
  -H "Authorization: Bearer ${TOKEN}" \
  --data-urlencode "query={app=\"yunshitang\"} |= \"${API_PATH}\"" \
  --data-urlencode "start=${START}" \
  --data-urlencode "end=${END}" \
  --data-urlencode "limit=200" \
  --data-urlencode "direction=forward" \
  | python3 -c "
import sys, json, re
data = json.load(sys.stdin)
if data.get('status') != 'success':
    print('Error:', data); sys.exit()

# 从匹配的请求日志中提取 traceId
trace_ids = set()
all_lines = []
for stream in data['data']['result']:
    for ts, line in stream['values']:
        all_lines.append(line)
        # 提取 traceId(第2个逗号分隔字段)
        parts = line.split(',')
        if len(parts) >= 2:
            tid = parts[1].strip()
            if len(tid) >= 32:
                trace_ids.add(tid)

print(f'Found {len(all_lines)} lines, {len(trace_ids)} unique traceIds')
print()
for tid in list(trace_ids)[:10]:
    print(f'  traceId: {tid}')
print()
for line in all_lines[:30]:
    print(line)
if len(all_lines) > 30:
    print(f'... and {len(all_lines)-30} more lines')
"

进阶:找到 traceId 后,再用场景 1 查该 traceId 的完整链路。

场景 3:关键词搜索

用户说:"搜一下 LeException" 或 "查 ERROR 日志"

KEYWORD="LeException"
END=$(date +%s)000000000
START=$(( $(date +%s) - 21600 ))000000000  # 最近6小时

curl -s "${API}/query_range" \
  -H "Authorization: Bearer ${TOKEN}" \
  --data-urlencode "query={app=\"yunshitang\"} |= \"${KEYWORD}\"" \
  --data-urlencode "start=${START}" \
  --data-urlencode "end=${END}" \
  --data-urlencode "limit=100" \
  --data-urlencode "direction=backward"

常用关键词组合

# 所有 ERROR 日志
{app="yunshitang"} |= "ERROR"

# 业务异常
{app="yunshitang"} |= "LeException"

# SQL 错误
{app="yunshitang"} |~ "SQLSyntaxError|DataAccessException|BadSqlGrammar"

# 空指针
{app="yunshitang"} |= "NullPointerException"

# 按类名搜索
{app="yunshitang"} |= "OrderInfoService"

# 组合:ERROR + 特定类
{app="yunshitang"} |= "ERROR" |= "OrderInfoService"

# 排除健康检查噪音
{app="yunshitang"} |= "ERROR" != "health" != "actuator"

场景 4:按接口查完整链路(组合查询)

用户说:"查 /api/v2/web/order/list 接口的全链路日志"

两步走

  1. 先按接口路径搜索,拿到 traceId
  2. 再按 traceId 查完整链路
# Step 1: 找 traceId
API_PATH="/api/v2/web/order/list"
END=$(date +%s)000000000
START=$(( $(date +%s) - 21600 ))000000000  # 最近6小时

TRACE_IDS=$(curl -s "${API}/query_range" \
  -H "Authorization: Bearer ${TOKEN}" \
  --data-urlencode "query={app=\"yunshitang\"} |= \"${API_PATH}\" |= \">>>\"" \
  --data-urlencode "start=${START}" \
  --data-urlencode "end=${END}" \
  --data-urlencode "limit=10" \
  --data-urlencode "direction=backward" \
  | python3 -c "
import sys, json
data = json.load(sys.stdin)
for stream in data.get('data',{}).get('result',[]):
    for ts, line in stream['values']:
        parts = line.split(',')
        if len(parts) >= 2 and len(parts[1].strip()) >= 32:
            print(parts[1].strip())
")

echo "Found traceIds:"
echo "${TRACE_IDS}" | head -5

# Step 2: 用第一个 traceId 查完整链路
FIRST_TID=$(echo "${TRACE_IDS}" | head -1)
if [ -n "${FIRST_TID}" ]; then
  curl -s "${API}/query_range" \
    -H "Authorization: Bearer ${TOKEN}" \
    --data-urlencode "query={app=\"yunshitang\"} |= \"${FIRST_TID}\"" \
    --data-urlencode "start=${START}" \
    --data-urlencode "end=${END}" \
    --data-urlencode "limit=500" \
    --data-urlencode "direction=forward" \
    | python3 -c "
import sys, json
data = json.load(sys.stdin)
for stream in data.get('data',{}).get('result',[]):
    for ts, line in stream['values']:
        print(line)
"
fi

场景 5:指定 project 环境查询

如果用户指定了具体的 project(如 test20):

{app="yunshitang",project="test20"} |= "traceId值"

LogQL 语法速查

流选择器

操作语法示例
精确匹配={app="yunshitang"}
不等于!={app!="test"}
正则匹配=~{project=~"test2.*"}

行过滤

操作语法示例
包含`\=``\= "ERROR"`
不包含!=!= "DEBUG"
正则匹配`\~``\~ "Exception\Error"`
正则排除!~`!~ "health\ping"`

查看可用标签值

# 列出所有 project
curl -s "${API}/label/project/values" -H "Authorization: Bearer ${TOKEN}"

# 列出所有 app
curl -s "${API}/label/app/values" -H "Authorization: Bearer ${TOKEN}"

Bug 修复工作流

1. 获取线索(traceId / 接口路径 / 错误关键词)
   ↓
2. 确定环境(哪个 Grafana?读取 environments.json)
   ↓
3. 查询日志(场景 1-4 选择合适的查询方式)
   ↓
4. 分析日志(ERROR/异常堆栈/SQL 错误/耗时)
   ↓
5. 定位代码(类名:行号 → 项目搜索)
   ↓
6. 修复 + 更新云效任务状态

日志分析重点

  1. ERROR 级别日志 — 异常根因
  2. 异常堆栈at net.xnzn.core.xxx 开头的行
  3. SQL 错误SQLSyntaxErrorExceptionDataAccessException
  4. 业务异常LeException 抛出的位置
  5. 耗时Completed xxx in Nms,识别慢请求
  6. 请求/响应RequestLoggingFilter>>><<< 日志

联动技能

场景联动技能
排查 Bugbug-detective
查询云效任务yunxiao-task-management
查数据库mysql-debug
性能问题performance-doctor

Grafana Service Account Token 创建

每个 Grafana 环境需要独立创建 Token:

  1. 登录对应 Grafana URL
  2. 左侧菜单 → Administration → Service accounts
  3. Add service account(名称:claude-loki-reader),角色:Viewer
  4. Add service account token → 复制
  5. 更新 environments.json 中对应环境的 token 字段

注意

  • 如果 Token 为空会报 invalid API key,需要先为该环境创建 Token
  • 查询默认不限 project,可覆盖该 Grafana 下所有项目环境
  • direction=forward 按时间正序,direction=backward 按时间倒序(最新优先)
  • 如果是 Bug 排查完整流程,同时使用 bug-detective

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

38.22%
按下载量换算34

Claude

30.6%
按下载量换算28

Cursor

18.45%
按下载量换算17

Gemini CLI

9.43%
按下载量换算8

安全审计

Gen Agent Trust Hub

未通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills