10日で覚えるSplunkDay 3: サーチの基本
books.chapter 310日で覚えるSplunk

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
  1. 時間範囲を可能な限り絞る
  2. **index**を必ず指定する
  3. キーワードとフィールドで早めにフィルタする
  4. fieldsコマンドで不要なフィールドを除外する
  5. 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 件数制限

重要ポイント

  1. indexを必ず指定してサーチのパフォーマンスを上げる
  2. フィールド検索はキーワード検索より効率的
  3. パイプでコマンドをつなげてデータを段階的に処理
  4. 時間範囲を絞ってサーチコストを削減

練習問題

問題1: 基本

index=mainで過去24時間のイベントを検索し、_time, host, sourcetypeをテーブル表示してください。

問題2: 応用

ステータスコードが400以上のイベントを検索し、clientipで重複を除去して、ユニークなIPアドレス一覧をアルファベット順で表示してください。

チャレンジ問題

過去7日間のデータから、ホストごとの最新イベントのみを取得し、host, _time, sourcetypeをテーブル表示するSPLを書いてください。


参考リンク


次回予告: Day 4では「フィールドとフィルタリング」について学びます。evalwhereコマンドでデータを加工・フィルタする方法をマスターしましょう。