覚えるのは10個だけ SplunkSPLコマンド出る順
こんにちは。
この記事では、Splunkでよく使うSPLを出る順で10個紹介します。
なぜ10個かというと、Splunkでよく使うコマンドがだいたいそれくらいだからです。
以下の記事の続きですが、単体で読んでも大丈夫です。
canada-lemon.hatenablog.com
備考
- ここではコマンドの概要のみ記載し、細かい説明は別の記事で書きます
- 簡単なSPLの例を掲載しますが、これはSplunkがデフォルトで出力するしているログを使うので、Splunkをインストールしてさえいればすぐ実行できます
- SPLの構文例は簡略化して記載しています(正確に厳密に書こうとするとややこしくなるので)
記事内で「フィールド」という単語を使っていますが、表でいうところの「列名」と解釈してください
- 2. rename
- 3. eval
- 4. stats
- 5. eventstats
- 6. sort
- 7. timechart
- 8. lookup
- 9. where
- 10. search
1. table
フィールド名を指定して表を作るコマンドです。
- 使用例
- 検索結果を表形式で見る
- 既存の表の列の順番を入れ替える
- 既存の表の列を一部削除する
- 補足
- フィールドの区切りはスペースでもカンマでもOK
構文例
| table <フィールド名>
以下のSPL例では、ログの時間、ホスト名、生ログを表形式で表示しています。
SPL例
index=_internal | table _time host _raw
2. rename
フィールド名を変更するコマンドです。
- 使用例
- フィールド名を英語から日本語に翻訳する
- 補足
- _timeをリネームするとUNIX時間に変換される
構文例
| rename <リネーム前のフィールド名> as <リネーム後のフィールド名>
以下のSPL例では、ログの時間、ホスト名、生ログを表形式で表示した後、ホスト名を示すフィールドをリネームしています。
SPL例
index=_internal | table _time host _raw | rename host as "ホスト名"
tableもrenameもフィールド名にワイルドカードを使えますが、基本的には1つ1つ明示的に書くほうがミスが起きにくく、後からメンテしやすいです。
3. eval
新しくフィールドを定義するコマンドです。
- 使用例
- 2つのフィールドの数字を足し算する
- フィールドに特定の文字列を追加する
- 補足
構文例
| eval <新しく定義するフィールド名> = (何らかの加工処理)
「何らかの加工処理」は大きく分けて文字列の結合、数字の計算、IF構文などです。
以下のSPL例では、ホスト名のフィールドに文字を結合しています。
SPL例
index=_internal | eval host_name = "ホスト名は" + host + "です" | table _time host host_name
4. stats
ログの統計情報を集計するコマンドです。
- 使用例
- ソースタイプ(ログの種類)ごとのログの件数を計算する
- 補足
- 集計処理はログの量が増えるについて重くなる
構文例
| stats (何らかの集計処理) by <集計単位のフィールド名>
「何らかの集計処理」は、簡単に言えば統計情報の計算です。
以下のSPL例では、countでソースタイプ別のログ件数を集計しています。
SPL例
index=_internal | stats count by sourcetype
5. eventstats
statsのように集計処理を行い、evalのようにフィールドを新しく定義できる、両者の中間みたいなコマンドです。
- 使用例
- クラスごとに試験の平均点を計算し、生徒の点数がクラスの平均以上か未満かを表示する
- 補足
- statsと同様、検索結果のログ全体が集計対象となるのでログの量によって処理が重くなる
構文例
| eventstats (何らかの集計処理) as <新しく定義するフィールド名> by <集計単位のフィールド名>
以下のSPL例では、アクセスログの平均バイト数をeventstatsで計算し、evalのIF構文で平均以上か未満かを判定しています。
SPL例
index=_internal sourcetype=splunkd_access | eventstats avg(bytes) as avgBytes | eval judge_avg = if(bytes>=avgBytes,"平均以上","平均未満") | table _time bytes avgBytes judge_avg
6. sort
フィールドを指定してソートするコマンドです。
- 使用例
- ログの件数をソースタイプごとに集計し、件数が多い順に表示する
- 補足
- デフォルトは昇順、フィールド名の前に"-"をつけると降順となる
- デフォルトはソート件数に制限があり、無制限にするにはsortの後に"0"をつける
構文例
| sort <フィールド名>
以下のSPL例では、ソースタイプ別にログの件数を集計し、降順(件数が多い順)に並び替えています。
SPL例
index=_internal | stats count by sourcetype | sort 0 -count
7. timechart
statsを時系列の処理に特化させたコマンドです。
- 使用例
- 1日のログ件数の推移を1分単位で表示する
- 補足
- 行数が5万行を超えると上手く表示されなくなる
構文例
| timechart span=(時間の単位) (集計処理) by <フィールド名>
以下のSPL例では、ソースタイプ別のログ件数の推移を、1分単位で時系列順に示しています。
SPL例
index=_internal | timechart span=1m count by sourcetype
8. lookup
ExcelのLOOKUPみたいなことをやってくれるコマンドです。
- 使用例
- 商品IDからその商品名や価格を知りたいとき
- 補足
- ルックアップに使うファイルに欠損値がないよう気をつける
構文例
| lookup (ルックアップの名前) <元のログのフィールド名> OUTPUT <新しく増やすフィールド名>
このコマンドを使うには前準備が必要なので、本記事でのSPL例は割愛いたします。
9. where
条件を設定してログを絞り込むコマンドです。
構文例
| where (条件)
以下のSPL例では、「statusフィールドを持たない」を条件としてログを絞り込んでいます。
SPL例
index=_internal | where isnull(status)
10. search
ログを検索するというある意味もっとも重要なコマンドだけど、最初の内は意識して使わないので、優先度を下げて10番目にしました。
- 使用例
- ログを検索する(明示的には書かない)
stats
等で作成した表に対し、その中身を検索する(明示的に書く)
- 補足
- SPLの先頭で使うときは書く必要がないけど、それ以外の場面で忘れると怒られる
構文例
| search (検索内容)
以下のSPL例では、ステータスコードが200のログを検索しています。
SPL例
index=_internal status=200
9割ほど書いてから、同コンセプトの記事を既に書いている方がいらっしゃるのを知りました。
Splunk: Splunk入門(SPL編 2/6) - よく使用するコマンド11選 - Qiita
掲載しているコマンドの数もラインナップもほぼ同じで、流石にこのあたりはユーザー間の共通認識というところでしょうか。
ここまで読んでいただき、ありがとうございました。
Splunk頻出SPLシリーズ