用 Splunk 查 Log 查到眼花?教你 5 個 SPL 搜尋技巧幫你慳返一半時間

# 用 Splunk 查 Log 查到眼花?教你 5 個 SPL 搜尋技巧幫你慳返一半時間 做 IT 嘅你一定試過——server 出咗事,老細企喺你後面等答案,你對住 Splunk 個 search bar 打咗十幾行 SPL(Search Processing Language),結果出嚟一堆垃圾。或者更慘嘅係,等咗成分鐘先出結果,然後發現自己打錯咗 field name。 唔使驚,今日就同大...

用 Splunk 查 Log 查到眼花?教你 5 個 SPL 搜尋技巧幫你慳返一半時間 - 文章重點速覽 infographic

# 用 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

`(?pattern)` 呢個 named group syntax 會自動建立一個新 field,之後就可以直接用 `txn_id` 做 stats、join 或者 filter。

## 技巧五:`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 技巧你覺得好用?留言分享下!