
# 用 Splunk 查 Log 查到眼花?教你 5 個 SPL 搜尋技巧幫你慳返一半時間
做 IT 嘅你一定試過——server 出咗事,老細企喺你後面等答案,你對住 Splunk 個 search bar 打咗十幾行 SPL(Search Processing Language),結果出嚟一堆垃圾。或者更慘嘅係,等咗成分鐘先出結果,然後發現自己打錯咗 field name。
唔使驚,今日就同大家分享 5 個實用 SPL 技巧,幫你搜 log 搜得快靚正。
## 技巧一:用 `tstats` 取代 `stats` 加速查詢
好多人一開波就 `index=xxx | stats count by host`,但當你個 index 有幾百萬個 event 嗰陣,呢個 query 可以跑到天荒地老。
`tstats` 係 Splunk 嘅加速版 stats,佢直接讀取 tsidx(time-series index)檔案而唔係逐個 raw event 掃描,速度可以快 10 到 100 倍:
| tstats count WHERE index=web_logs sourcetype=nginx BY host
**重點:** `tstats` 只支援 `index`、`sourcetype`、`source`、`host` 呢幾個 metadata field。如果你想 filter 其他 field,要用 `| search` pipe 喺後面加:
| tstats count WHERE index=web_logs BY host
| search host="prod-web-01"
## 技巧二:`eval` + `case()` 做條件分類
成日要將 HTTP status code 分類?與其寫幾個 `eval if()`,不如用 `case()` 一次過搞掂:
index=web_logs
| eval status_group = case(
status >= 200 AND status < 300, "2xx Success",
status >= 300 AND status < 400, "3xx Redirect",
status >= 400 AND status < 500, "4xx Client Error",
status >= 500 AND status < 600, "5xx Server Error",
true(), "Unknown"
)
| stats count by status_group
`case()` 會按順序評估每個 condition,第一個 match 就 return,最後嘅 `true()` 係 default catch-all——等於 SQL 嘅 ELSE。
## 技巧三:`timechart` 加 `partial=f` 防止假數據
呢個係好多人中過嘅伏。當你用 `timechart` 嗰陣,Splunk 預設會對 incomplete bucket(即係仲未夠鐘嘅時間區間)做 extrapolation,搞到最尾個 data point 望落異常地高或低。
加 `partial=f` 就可以 skip 咗呢個 incomplete bucket:
index=web_logs
| timechart span=1h count BY host partial=f
咁樣你個 chart 就唔會出現「最後一粒鐘得 10 分鐘數據但俾你 extrapolate 到好似好大鑊」嘅情況。
## 技巧四:`rex` 提取自訂 Field
有時 log 入面嘅重要資訊冇俾 Splunk 自動 parse 做 field,就要靠 `rex` 用 regex 手動提取:
index=app_logs "Transaction ID"
| rex field=_raw "Transaction ID: (?<txn_id>[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12})"
| table _time, txn_id, status
`(?
## 技巧五:`inputlookup` 加 CSV 做 Enrichment
你手上有個 CSV 入面有 server owner 資料,想將佢同 Splunk search result 做 join?唔使 export 出 Excel 慢慢 vlookup,直接用 `inputlookup`:
首先 upload 個 CSV 做 lookup table(Settings → Lookups → Add new),假設你叫佢做 `server_owners.csv`:
index=server_metrics
| stats latest(cpu_pct) AS cpu BY host
| inputlookup append=t server_owners.csv
| stats values(owner) AS owner, values(cpu) AS cpu BY host
| where isnotnull(owner)
`append=t` 會將 lookup table 嘅 row append 落去 search result 度,然後用 `stats values()` 做合併。
## 進階貼士:Macro 幫你慳打字
如果你成日要打同一段複雜 SPL,可以將佢包裝成 macro(Settings → Advanced Search → Search Macros)。例如:
`error_5xx(7d)` → 自動展開成 index=* sourcetype=* status>=500 earliest=-7d@d
之後每次打 \`error_5xx(7d)\` 就得,慳返唔少打字時間。
## 總結
呢 5 個技巧——`tstats` 加速、`case()` 分類、`timechart partial=f`、`rex` 提取、`inputlookup` 合併——係每個 Splunk 用家都應該識嘅基本功。記住佢哋,下次俾人追數嗰陣你至少可以快啲揾到答案,而唔係對住個 spinning wheel 發呆。
🔗 參考資料:NVD NIST 漏洞資料庫
有咩 SPL 技巧你覺得好用?留言分享下!



