Day 3: サーチの基本
今日学ぶこと
- SPLの基本構文
- キーワード検索とフィールド検索
- 時間範囲の指定
- パイプとコマンドチェーン
- 基本コマンド(table, fields, rename, sort, dedup)
SPLの基本構文
SPL(Search Processing Language)はSplunkのクエリ言語です。
検索条件 | コマンド1 | コマンド2 | コマンド3
flowchart LR
Search["検索条件<br>イベントの絞り込み"]
Cmd1["コマンド1<br>データ変換"]
Cmd2["コマンド2<br>集計・フィルタ"]
Cmd3["コマンド3<br>出力整形"]
Search -->|"|"| Cmd1 -->|"|"| Cmd2 -->|"|"| Cmd3
style Search fill:#3b82f6,color:#fff
style Cmd1 fill:#22c55e,color:#fff
style Cmd2 fill:#f59e0b,color:#fff
style Cmd3 fill:#8b5cf6,color:#fff
サーチの2つのフェーズ
| フェーズ | 説明 | 例 |
|---|---|---|
| 検索フェーズ | インデックスからイベントを取得 | index=main ERROR |
| 変換フェーズ | パイプ以降のデータ処理 | ` |
パフォーマンスTip: 検索フェーズでできるだけ多くの条件を指定し、処理するイベント数を減らしましょう。
キーワード検索
基本的な検索
error
全インデックスから「error」を含むイベントを検索します(大文字小文字を区別しない)。
AND / OR / NOT
error AND login
error OR warning
error NOT timeout
# AND は省略可能(スペースで区切るとAND)
error login
ワイルドカード
fail* # fail, failed, failure, ...
*exception* # NullPointerException, ...
完全一致(引用符)
"failed login attempt" # フレーズ全体で検索
"status=404" # 完全一致
フィールド検索
フィールド名を指定して検索できます。
index=main
index=main sourcetype=syslog
index=main host=web-server-01
index=main status=500
index=main user=alice action=login
フィールドの比較演算子
status=200 # 等しい
status!=200 # 等しくない
status>400 # より大きい
status>=400 # 以上
status<300 # より小さい
status<=299 # 以下
複数値の指定
# OR を使う
status=404 OR status=500 OR status=503
# IN 演算子(推奨)
status IN (404, 500, 503)
時間範囲
タイムピッカー
Web UIのタイムピッカーで視覚的に指定できます。
SPLでの時間指定
index=main earliest=-1h # 過去1時間
index=main earliest=-24h latest=now # 過去24時間
index=main earliest=-7d@d # 過去7日(日の境界でスナップ)
index=main earliest="01/30/2026:00:00:00" # 絶対時間
時間修飾子
| 修飾子 | 説明 | 例 |
|---|---|---|
s |
秒 | -30s |
m |
分 | -15m |
h |
時間 | -1h |
d |
日 | -7d |
w |
週 | -1w |
mon |
月 | -1mon |
@ |
スナップ(切り捨て) | -1d@d(昨日の0時) |
スナップの例
earliest=-1d@d latest=@d # 昨日の丸1日
earliest=@w0 # 今週の日曜日から
earliest=-1mon@mon # 先月の1日から
基本コマンド
table
指定したフィールドをテーブル形式で表示します。
index=main sourcetype=access_combined
| table _time, clientip, method, uri, status
fields
表示するフィールドを制限します(パフォーマンス向上にも有効)。
index=main
| fields host, source, sourcetype, _time
# フィールドの除外
index=main
| fields - _raw, _time
| コマンド | 目的 | 違い |
|---|---|---|
table |
テーブル形式で出力 | 表示を整形、順序を指定 |
fields |
フィールドを選択/除外 | パフォーマンス最適化に有効 |
rename
フィールド名を変更します。
index=main
| rename clientip AS "クライアントIP", status AS "ステータス"
| table "クライアントIP", "ステータス"
sort
結果をソートします。
# 昇順(デフォルト)
index=main
| table _time, status
| sort status
# 降順
index=main
| table _time, status
| sort -status
# 複数フィールド
index=main
| table host, status, _time
| sort host, -status
# 上位N件
index=main
| sort 10 -status
dedup
重複を除去します。
# ホストごとに最新の1件だけ
index=main
| dedup host
| table host, _time, status
# 複数フィールドの組み合わせで重複除去
index=main
| dedup host, status
| table host, status, _time
head / tail
先頭/末尾のN件を取得します。
index=main
| head 10 # 最初の10件
index=main
| tail 5 # 最後の5件
サーチモード
| モード | 説明 | 用途 |
|---|---|---|
| Fast | フィールド検出を最小化 | イベント数の確認 |
| Smart | 自動最適化 | 通常使用(デフォルト) |
| Verbose | すべてのフィールドを抽出 | フィールドの調査 |
推奨: 通常はSmartモードを使い、パフォーマンスが必要な場合はFastモードに切り替えましょう。
サーチのベストプラクティス
flowchart TB
subgraph Best["サーチ最適化のポイント"]
Time["時間範囲を絞る<br>earliest=-1h"]
Index["インデックスを指定<br>index=main"]
Fields["フィールドで絞り込む<br>status=500"]
Limit["結果を制限<br>head 100"]
end
Time --> Index --> Fields --> Limit
style Time fill:#22c55e,color:#fff
style Index fill:#22c55e,color:#fff
style Fields fill:#f59e0b,color:#fff
style Limit fill:#f59e0b,color:#fff
- 時間範囲を可能な限り絞る
- **
index**を必ず指定する - キーワードとフィールドで早めにフィルタする
fieldsコマンドで不要なフィールドを除外するheadで結果数を制限して確認する
実践: Webアクセスログの分析
# 1. エラーイベントを検索
index=main sourcetype=access_combined status>=400
# 2. エラーの一覧をテーブル表示
index=main sourcetype=access_combined status>=400
| table _time, clientip, method, uri, status
| sort -_time
# 3. ステータスコード別のカウント
index=main sourcetype=access_combined
| stats count by status
| sort -count
# 4. ユニークなURIを表示
index=main sourcetype=access_combined status=200
| dedup uri
| table uri
| sort uri
# 5. 直近100件のアクセスログ
index=main sourcetype=access_combined
| head 100
| table _time, clientip, method, uri, status
| rename clientip AS "IP", method AS "メソッド", uri AS "URI", status AS "ステータス"
まとめ
| 概念 | 説明 |
|---|---|
| キーワード検索 | テキストを含むイベントを検索 |
| フィールド検索 | field=valueで絞り込み |
| AND / OR / NOT | 論理演算子 |
| IN | 複数値のマッチング |
パイプ (|) |
コマンドをつなげる |
table |
テーブル形式で出力 |
fields |
フィールドの選択/除外 |
sort |
ソート |
dedup |
重複除去 |
head / tail |
件数制限 |
重要ポイント
indexを必ず指定してサーチのパフォーマンスを上げる- フィールド検索はキーワード検索より効率的
- パイプでコマンドをつなげてデータを段階的に処理
- 時間範囲を絞ってサーチコストを削減
練習問題
問題1: 基本
index=mainで過去24時間のイベントを検索し、_time, host, sourcetypeをテーブル表示してください。
問題2: 応用
ステータスコードが400以上のイベントを検索し、clientipで重複を除去して、ユニークなIPアドレス一覧をアルファベット順で表示してください。
チャレンジ問題
過去7日間のデータから、ホストごとの最新イベントのみを取得し、host, _time, sourcetypeをテーブル表示するSPLを書いてください。
参考リンク
次回予告: Day 4では「フィールドとフィルタリング」について学びます。evalやwhereコマンドでデータを加工・フィルタする方法をマスターしましょう。