Appearance
查詢 audit log
何時用這份文件 你要回答:
- 「過去 X 時間,有人對 Y 做了什麼?」
- 「Z 帳號最近的活動軌跡」
- 「某事故的時間軸」
- 月度 / 季度合規報表
前置條件
- 你的角色擁有
bb.auditLog.read - 已讀過 Audit Log 概念 的欄位定義與動作清單
三種查詢方式
| 方式 | 適合 | 限制 |
|---|---|---|
| UI | 探索式查、單一事件追蹤 | 一次最多回 1000 筆;不適合大量分析 |
| API(REST/gRPC) | 程式化、自動化報表 | filter 語法需學一下 |
| 直連 metastore SQL | 大量分析、ad-hoc 統計 | 繞過 UI 權限;極少人應有此權限 |
UI 操作
Audit Log(左側 sidebar)。
可篩選:
- Time range:絕對 / 相對(最近 24h、7d、30d…)
- Actor:user / system runner
- Action:多選(
bb.issue.approve/bb.taskrun.start/ …) - Resource type / resource:
projects/<p>/issues/<i>等 - Severity:
info/notice/warning/critical - Response status:
ok/denied/error - Correlation ID:追同一個請求的所有 entry
常用視角
- 某個 issue 的時間軸 → 篩
resource = projects/<p>/issues/<i>,依時間排 - 某 user 過去 7 天動作 → 篩
actor = user/login_id=<id>,期間 7d - 登入失敗潮 → 篩
action = bb.auth.login.fail,依 actor / IP 分組
API 操作
bash
# 基本範例
curl -s -H "Authorization: Bearer $TOKEN" \
"$ARGUS/v1/auditLogs?filter=resource:projects/play/issues/42" | jq
# 多條件 AND
curl -s -H "Authorization: Bearer $TOKEN" \
"$ARGUS/v1/auditLogs?filter=actor:alice%20AND%20action:bb.issue.approve" | jq
# 時間範圍
curl -s -H "Authorization: Bearer $TOKEN" \
"$ARGUS/v1/auditLogs?filter=timestamp%3E%3D2026-05-01T00:00:00Z%20AND%20timestamp%3C2026-06-01T00:00:00Z" | jqfilter 完整語法
| 運算 | 語法 | 例 |
|---|---|---|
| 等於 | field:value | actor:alice |
| 大於 | field>value | timestamp>2026-05-01T00:00:00Z |
| 小於等於 | field<=value | severity<=warning |
| AND | ... AND ... | actor:alice AND action:bb.issue.approve |
| OR | ... OR ... | action:bb.issue.reject OR action:bb.issue.cancel |
| 萬用 | field:prefix* | resource:projects/play/* |
可篩欄位:timestamp / actor / actor_ip / action / resource / resource_type / severity / response_status / correlation_id。
常見場景模板
1. 「過去 30 天,所有 prod DDL 是誰批的?」
bash
filter='resource:projects/*/issues/*
AND action:bb.issue.approve
AND timestamp>=2026-04-23T00:00:00Z
AND extra.environment:prod
AND extra.change_type:DDL'2. 「某 user 上週活動」
bash
filter='actor:user/login_id=alice
AND timestamp>=2026-05-16T00:00:00Z
AND timestamp<2026-05-23T00:00:00Z'3. 「登入失敗集中現象」
bash
filter='action:bb.auth.login.fail
AND timestamp>=2026-05-22T00:00:00Z'回傳後用 jq 依 actor_ip 分組:
bash
... | jq -r '.auditLogs[] | .actorIp' | sort | uniq -c | sort -rn4. 「上週所有審批者 reject 的單」
bash
filter='action:bb.issue.reject
AND timestamp>=2026-05-16T00:00:00Z
AND timestamp<2026-05-23T00:00:00Z'5. 「Setting 被誰改過」
bash
filter='action:bb.setting.update
AND timestamp>=2026-04-01T00:00:00Z'特別注意 severity = critical 的 setting 變動:EMERGENCY_PAUSE 切換、disallow_self_approval_default 改動。
6. 「override 紀錄」
bash
filter='extra.override_reason:*
AND timestamp>=2026-04-01T00:00:00Z'7. 「同一個請求的完整鏈路」
bash
filter='correlation_id:req-2026-05-23-09-42-...'回傳會是同一個 HTTP / RPC 請求引發的所有 audit entry(含子動作)。
8. 「SQL Editor 違規查詢」(A2 PR-1 後可用)
A2 PR-1 起,Argus 對互動 SQL(Query / AdminExecute / Export)跑跟 Plan 流程同一套 advisor 規則庫。違規會寫入 audit_log 一條 RULE_VIOLATION 事件:
bash
filter='method=/argus.v1.SQLService/AdvisorViolation
AND timestamp>=2026-06-01T00:00:00Z'只看 ERROR 嚴重度(必須處理的):
bash
filter='method=/argus.v1.SQLService/AdvisorViolation
AND severity=ERROR
AND timestamp>=2026-06-01T00:00:00Z'回傳的每筆 row 的 service_data 是一個 packed AuditDetailAdvisorViolation:
jsonc
{
"queryPath": "query", // query / admin_execute / export
"instance": "smoke-m2",
"database": "app",
"statementRedacted": "SELECT * FROM users WHERE 1=1",
"violations": [
{ "title": "STATEMENT_SELECT_NO_SELECT_ALL", "status": "ERROR",
"content": "\"SELECT * FROM users WHERE 1=1\" uses SELECT all" },
{ "title": "STATEMENT_OBJECT_OWNER_CHECK", "status": "ERROR",
"content": "..." },
{ "title": "STATEMENT_CHECK_SET_ROLE_VARIABLE", "status": "WARNING",
"content": "No SET ROLE statement found." }
]
}SQL 字面已 redact(PII / 密文不會留在 audit log,跟
query_history同政策)。actor 在 row 的user欄位。
常見追問:
| 想問 | 怎麼篩 |
|---|---|
| 「alice 上週踩了哪些規則」 | method=/argus.v1.SQLService/AdvisorViolation AND user=users/alice |
「STATEMENT_SELECT_NO_SELECT_ALL 上個月 fleet 共幾次」 | UI 拿出全部 AdvisorViolation rows 後在 service_data.violations[] 統計 |
| 「Export path 上的違規(資料外流前的合規 hot zone)」 | 篩後再看 service_data.queryPath = "export" 的子集 |
同樣資料也存在
query_history.payload.rule_violations[],但 audit_log 是「跨 user 跨 project」的單一查詢入口;query_history 是「我自己跑過的」視角。詳見 SQL Editor 概念。
直連 metastore SQL
⚠️ 繞過 UI 權限。只有極少數人(DBA Lead)應有此存取,且此存取本身會在 PG-level audit 留痕(
9006##audit_rls_and_roles.sql)。
sql
SET search_path TO public;
-- 過去 7 天 prod 上的所有 DDL 審批
SELECT
ts AS timestamp,
actor,
resource,
payload->>'message' AS message
FROM audit_log
WHERE ts >= now() - interval '7 days'
AND action = 'bb.issue.approve'
AND payload->>'environment' = 'prod'
AND payload->>'change_type' = 'DDL'
ORDER BY ts DESC;實際表名與欄位以 LATEST.sql 為準(Migration)。
寫進 audit log 的「查詢動作」
對 audit log 的查詢與匯出本身會被記錄:
bb.auditlog.query(含 filter 條件、回傳筆數)bb.auditlog.export(含 filter 與輸出檔 hash)
換句話說,「誰查了 audit log」這件事 也 在 audit log 裡。