こんにちは、初めまして。技術本部のY.T.です。
初のブログ執筆になります。よろしくお願いします。
さて突然ですが、今回はSumo Logicのクエリの書き方について書こうと思います。現在Sumo Logicに興味を持って下さっている方や、クエリを使ったログ分析のイメージを掴みたいという方の参考になれば幸いです。
クエリとは
Sumo Logicのクエリとは、ログデータやメトリクスなどを検索、分析するために記述する命令文のことです。クエリを書くことでログの絞り込みを行い、ダッシュボードとして可視化したり、アラートを発報することができます。
クエリは、オペレーターという命令語をいくつも組み合わせて作られています。
クエリの書き方
ここではよく使われるオペレーターを3つほど紹介し、書き方や動作をご紹介します。
以下のようなCSV形式のログデータが、Sumo Logicに取り込まれているという前提で見ていきます。(今回の例では、あらかじめフィールド化(パース処理)されている前提でご紹介していきます。本来は必要に応じてパース文を書く必要があります。)
ログデータ(_sourceCategory="test")
# |
time |
event_type |
log_type |
logon_user |
access_group |
1 |
2025/5/15 16:06:22 |
ファイル削除 |
ファイル操作 |
ユーザーA |
営業2課 |
2 |
2025/5/15 15:29:30 |
ファイル削除 |
ファイル操作 |
ユーザーA |
営業2課 |
3 |
2025/5/15 15:01:05 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
4 |
2025/5/15 14:41:38 |
閲覧 |
Webアクセス |
ユーザーC |
サポート2課 |
5 |
2025/5/15 13:08:49 |
ファイル作成 |
ファイル操作 |
ユーザーA |
営業2課 |
6 |
2025/5/15 10:56:52 |
閲覧 |
Webアクセス |
ユーザーD |
営業2課 |
7 |
2025/5/15 10:23:57 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
8 |
2025/5/15 10:11:21 |
アップロード |
Webアクセス |
ユーザーD |
営業2課 |
9 |
2025/5/15 09:02:33 |
ダウンロード |
Webアクセス |
ユーザーD |
営業2課 |
10 |
2025/5/15 09:00:52 |
ドライブ追加 |
ファイル操作 |
ユーザーA |
営業2課 |
・count
該当するログの数を数える際はcountオペレーターを使用します。
countオペレーターには様々な使い方がありますが、これが最も基本の形になります。_sourceCategory="test"
| count
結果
# |
_count |
1 |
10 |
特定のカラムにグルーピングしてログを数えたい場合は以下のように記述します。_sourceCategory="test"
| count by event_type
結果
# |
event_type |
_count |
1 |
ファイル削除 |
2 |
2 |
ダウンロード |
3 |
3 |
閲覧 |
2 |
4 |
ファイル作成 |
1 |
5 |
アップロード |
1 |
6 |
ドライブ追加 |
1 |
・where
特定の条件に沿ってログを絞り込むにはwhereオペレーターを使用します。
今回はlog_typeフィールドが ”ファイル操作”のログのみに絞り込んでいます。_sourceCategory="test"
| where log_type = “ファイル操作"
結果
# |
time |
event_type |
log_type |
logon_user |
access_group |
1 |
2025/5/15 16:06:22 |
ファイル削除 |
ファイル操作 |
ユーザーA |
営業2課 |
2 |
2025/5/15 15:29:30 |
ファイル削除 |
ファイル操作 |
ユーザーA |
営業2課 |
3 |
2025/5/15 13:08:49 |
ファイル作成 |
ファイル操作 |
ユーザーA |
営業2課 |
4 |
2025/5/15 09:00:52 |
ドライブ追加 |
ファイル操作 |
ユーザーA |
営業2課 |
また、エクスクラメーションマーク(!)を使用することで、余事象を絞り込むことができます。_sourceCategory="test"
| where !(log_type = “ファイル操作")
結果
# |
time |
event_type |
log_type |
logon_user |
access_group |
1 |
2025/5/15 15:01:05 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
2 |
2025/5/15 14:41:38 |
閲覧 |
Webアクセス |
ユーザーC |
サポート2課 |
3 |
2025/5/15 10:56:52 |
閲覧 |
Webアクセス |
ユーザーD |
営業2課 |
4 |
2025/5/15 10:23:57 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
5 |
2025/5/15 10:11:21 |
アップロード |
Webアクセス |
ユーザーD |
営業2課 |
6 |
2025/5/15 09:02:33 |
ダウンロード |
Webアクセス |
ユーザーD |
営業2課 |
・timeslice
時間ごとにログを区切って絞り込みたい場合、timesliceオペレーターを使用します。
timesliceオペレーターを使用することで、ログを指定した期間で区切り、それぞれの期間内のログごとに処理を行います。
ここでは例としてtimesiceで1時間の範囲で区切り、countで集計してみます。_sourceCategory="test"
| timeslice 1h
| count by _timeslice
結果
# |
time |
_count |
1 |
2025/5/15 16:00:00 |
1 |
2 |
2025/5/15 15:0:00 |
2 |
3 |
2025/5/15 14:00:00 |
1 |
4 |
2025/5/15 13:00:00 |
1 |
5 |
2025/5/15 10:00:00 |
3 |
6 |
2025/5/15 09:00:00 |
2 |
1時間で区切りカウントすることで、1時間範囲ごとのそれぞれのログの数を出してくれます。
ここでは9時台が2件、10時台が3件、13時台が1件…のように、それぞれの時間でログ数をカウントしてくれています。
実例
先程紹介したオペレーターを使い、実際に使われるようなクエリを書いてみたいと思います。
今回は、内部監査用のダッシュボードに使用することを目的として、ダウンロード数の1時間ごとの推移をグラフで可視化してみようと思います。
使用するログは先程と同じものを使います。
ログデータ(_sourceCategory="test")
# |
time |
event_type |
log_type |
logon_user |
access_group |
1 |
2025/5/15 16:06:22 |
ファイル削除 |
ファイル操作 |
ユーザーA |
営業2課 |
2 |
2025/5/15 15:29:30 |
ファイル削除 |
ファイル操作 |
ユーザーA |
営業2課 |
3 |
2025/5/15 15:01:05 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
4 |
2025/5/15 14:41:38 |
閲覧 |
Webアクセス |
ユーザーC |
サポート2課 |
5 |
2025/5/15 13:08:49 |
ファイル作成 |
ファイル操作 |
ユーザーA |
営業2課 |
6 |
2025/5/15 10:56:52 |
閲覧 |
Webアクセス |
ユーザーD |
営業2課 |
7 |
2025/5/15 10:23:57 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
8 |
2025/5/15 10:11:21 |
アップロード |
Webアクセス |
ユーザーD |
営業2課 |
9 |
2025/5/15 09:02:33 |
ダウンロード |
Webアクセス |
ユーザーD |
営業2課 |
10 |
2025/5/15 09:00:52 |
ドライブ追加 |
ファイル操作 |
ユーザーA |
営業2課 |
手順1
クエリを書く際、まず使用したい情報が含まれるログのみに絞り込みます。
今回はダウンロードのログのみを使用するので、whereオペレーターでevent_typeをダウンロードのログのみに絞り込みます。_sourceCategory="test"
| where event_type = "ダウンロード"
結果
# |
time |
event_type |
log_type |
logon_user |
access_group |
1 |
2025/5/15 15:01:05 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
2 |
2025/5/15 10:23:57 |
ダウンロード |
Webアクセス |
ユーザーB |
営業2課 |
3 |
2025/5/15 09:02:33 |
ダウンロード |
Webアクセス |
ユーザーD |
営業2課 |
これで、今回使用するログが絞り込めました。
手順2
使用するログが絞り込めたので、次は可視化するための整形を行います。
1時間ごとの変化を見たいため、1時間ごとでカウントするクエリを書きます。_sourceCategory="test"
| where event_type = "ダウンロード"
| timeslice 1h
| count by _timeslice
結果
# |
time |
_count |
1 |
2025/5/15 15:00:00 |
1 |
2 |
2025/5/15 10:00:00 |
1 |
3 |
2025/5/15 09:00:00 |
1 |
これは11時~14時台に該当するログが無いためです。
本来11時~14時はダウンロードのログがないため「0」を表示したいです。
しかしcountオペレーターでは、該当するログが1つ以上ある場合しか表示されないため、このような結果になってしまいます。
ちなみに、この状態を折れ線グラフで表示すると以下のようになります。
ただの横這いですね。これでは推移のグラフとは言えません。
そこで次は、ダウンロードのログが無い時間帯を「0」で表示する作業を行います。
手順3
ダウンロードのログがない時間帯を含むすべてを結果に出すというクエリを書きます。
fillmissingオペレーターを使用することで、0を含む全てを結果に出すようになります。_sourceCategory="test"
| where event_type = "ダウンロード"
| timeslice 1h
| count by _timeslice
| fillmissing timeslice
結果
# |
time |
_count |
1 |
2025/5/15 16:00:00 |
0 |
2 |
2025/5/15 15:00:00 |
1 |
3 |
2025/5/15 14:00:00 |
0 |
4 |
2025/5/15 13:00:00 |
0 |
5 |
2025/5/15 12:00:00 |
0 |
6 |
2025/5/15 11:00:00 |
0 |
7 |
2025/5/15 10:00:00 |
1 |
8 |
2025/5/15 09:00:00 |
1 |
結果(折れ線グラフ)
当てはまるログがない時間も結果に出るようになり、増減の推移が分かるようになりました。
今回は元のログが少ないため値の小さいグラフでしたが、実際のログを用いた際はより値が大きく、より増減の推移が分かりやすく出るようになります。
最後に
いかがでしたでしょうか。本記事ではクエリの書き方の基本についてご紹介させていただきました。
今回は例として、オペレーターを3つほどご紹介させていただきましたが、実際のダッシュボードでは数多くのオペレーターを使用しています。
Sumo Logicでは、オペレーターを使用することで、取り込んだログを多様なニーズに合った形で可視化することができます。この記事を読んでくださった方が、少しでもSumo Logicのログ分析に興味を持って下されば幸いです。
- カテゴリ:
- Sumo Logic
- 技術情報
- 技術コラム
- 機能説明