はじめてのSplunk ― 概要から応用までを体系的に学ぶ

4-1 基本的なサーチ

前章では、実際にラボ環境を構築し、Splunkの基礎となる操作を一通り実行しました。 本章では、Splunk Core Certified Userの出題範囲をベースに、Splunkを使ってサーチを行うための基本知識を学習します。

サンプルとして提示しているSPLは、Splunkが公開しているチュートリアルデータに対してそのまま実行可能なものを提示しています。 実際にサーチを実行し、どのような結果が出力されるかを確認しながら学習していくとより理解が深まります。 (サーチを実行る際に、時間範囲を「全時間」に指定してサーチすることをお勧めします)

1. Splunkにおけるサーチの基本

Splunkでサーチを実行するときは、SPLと時間範囲の二つを指定します。 SPLはサーチバーに入力し、左端の虫眼鏡ボタン(実行ボタン)を押すと実行されます。 時間範囲は、サーチバーの右側にある「時間範囲」ウインドウから指定できす。

Time Range Pickerの画面
時間範囲の指定(Time Range Picker)画面

この時間範囲を選択するボタンはTime Range Picker(タイムレンジピッカー)と呼ばれます。 資格試験でたまに使われる用語なので、受験予定の方は覚えておくとよいでしょう。

時間範囲は、Time Range Pickerで選ぶだけでなく、SPLの中で直接指定することもできます。 以下は、直近24時間のmainインデックス内のイベントをサーチするSPLです。

SPL: 時間範囲を指定
index=main earliest=-24h@h latest=now

SPL中でearliest/latestを指定した場合、Time Range Pickerの値は無視され、SPL中の値が優先されます。 最近では、生成AIにSPLを作らせるとearliest/latestが勝手に付与されていることもありますので、実行前には注意しましょう。

2. ブーリアン(boolean/真偽式)

Splunkのサーチでは、AND/OR/NOT/XORといったブーリアンとカッコ()を組み合わせて条件を指定できます。 たとえば次のように書くと、rootという文字列を含まず、かつfailedまたはerrorのどちらかの文字列を含むイベント(ログ)だけをサーチできます。

SPL: ブーリアンとカッコの組み合わせ
index=main (failed OR error) NOT root

ブーリアンは常に大文字で書きます(サーチバー上ではオレンジ色で表示されます)。 小文字にすると演算子ではなく単なる文字列として解釈されてしまうので注意してください。

3. キーワードとフレーズ

サーチ時に指定する文字列には、キーワード(keywords)とフレーズ(quoted phrases)の二つの分類があります。 GETや200のような単独の文字列をキーワードと呼び、 "GET 200"のようにダブルクォートで囲んだ、空白を含む文字列をフレーズと呼びます(ドキュメントによっては「句」と訳されます)。 フレーズの引用符はダブルクォーテーションのみで、シングルダブルクォーテーションは使えません。

キーワードを二つ並べると、暗黙的にANDが適用されます。 つまり次の二つは同じサーチです。

SPL: 暗黙のAND条件
index=main GET 200
SPL: 明示したAND条件
index=main GET AND 200

一方、GET 200という並びの文字列を順序も含めそのままサーチしたいときはフレーズで指定する必要があります。 以下のサーチも試してみてください。

SPL: フレーズによる検索
index=main "GET 200"

キーワードによるサーチとフレーズによるサーチは、このような意図で用語が分けられています。

4. ワイルドカード/オペレーター(演算子)の使用

Splunkではワイルドカードとして*と?が使えます。 一般的な用法と同じく、*は任意の長さの文字列、?は任意の一文字を表します。

また、=,<,>,!=などのオペレーター(演算子)も利用可能です。

5. 句(Clauses)について

SplunkのSPLコマンドによっては、BY, OVER, ASなどの句(Clauses)を使って出力形式などを指定することがあります。 句は、小文字でも動作しますが、なるべく大文字で指定することが読みやすさの点で好ましいと言われています。

6. サーチジョブの寿命

実行指示を受けたサーチは、Splunk上ではサーチジョブとして管理されています。 サーチジョブの寿命(サーチを受け付けてからそのサーチの結果を保存し続けている期間)は、デフォルトで10分です。 実行完了までに10分以上かかるサーチジョブがあった場合は、途中でサーチは破棄されてしまいます。 また10分以内であれば、キャンセルを指示しない限りサーチジョブは動作し続けています。 サーチジョブの寿命はGUI上から延長を行うことができ、7日間まで伸ばすことが可能です。

7. 効率的なサーチの基本

効率的なサーチの追求は奥が深いテーマですが、最初に押さえておきたい基本は次の三点です。

  • 時間範囲とインデックスをサーチの最初に指定する

    Splunkは膨大なデータから対象を絞り込む際、処理の初期段階で時間範囲とインデックスによるフィルターをかけます。 この二つを最初に指定しておくと対象範囲が限定され、サーチ処理が効率化されます。

  • ワイルドカードはサーチコストが高い

    想像がしやすいと思われますが、ワイルドカードである*および?を使用すると、条件に一致するすべての文字列をヒットさせるため、サーチコストが高くなります。 また*を使う場合、後方一致のほうが前方一致よりもコストが低く済みます。 (これはつまり404-Errorをサーチする場合、*Errorより404*のほうがパフォーマンスが高いことを意味します) ワイルドカードを常に使わずに処理することは難しいのですが、可能であれば使用しない処理を検討する(例えば明確な文字列をORで連結させる等)ほうがよいでしょう。 また*を使う場合、選べる場面では後方一致で書くほうがよいことを覚えておきましょう。

  • NOTは多用しない

    NOTまたは!=)を指定すると、フィルター後のデータに対してNOT条件へ一致するかを再度確認する処理が発生します。 NOTは特定のイベントを除外するのに便利ですが、スケジュール実行で繰り返し走らせて負荷が高くなる場合は、別の書き方を検討したほうがよいこともあります。

8. まとめ

  • サーチはSPLと時間範囲の二つを指定して実行する。
  • 時間範囲はTime Range PickerまたはSPL中のearliest/latestで指定する
  • ブーリアンにはAND/OR/NOT/XORがある。()も利用可能。ブーリアンは全て大文字。
  • 単独の文字列をキーワード、ダブルクォーテーションで囲んだ空白入りの文字列をフレーズと呼ぶ
  • ワイルドカード/オペレーターとして*、?、=、<、>、!=などが利用可能
  • 句は小文字でも動作するが、基本的には大文字で指定する
  • Splunkのサーチジョブの寿命はデフォルトで10分。延長すると7日間まで保存可能
  • サーチ効率化の基本は「時間範囲とインデックス指定を先頭で実施」「ワイルドカードを使うとサーチコストが高くなる」「NOT(!=)は多用しない」