こんにちは。torippy1024です。
本日は、splunkを使ってソースタイプ作成やフィールド抽出定義をどう行うのか試してみます。
ソースタイプ/フィールド抽出とは
わざわざこの記事を読んでいる人であれば説明不要と思いますが、一応書いておきます。
ソースタイプとは、Splunkがログデータを分類するためにデータの構造、内容、形式を定義した属性です。フィールド抽出の定義、タイムスタンプの定義、改行の設定などの情報が含まれます。
参考:
https://docs.splunk.com/Splexicon:Sourcetype
フィールド抽出とは、ログデータに含まれる情報を抽出し、フィールドにマッピングする処理のことです。フィールドの抽出は、Splunkがログデータを受け取りインデックス化したときに行われるものと、サーチ実行時に行われるものの二つがあります。最近では、サーチ実行時に行われることのほうが多いようです。
参考:
https://docs.splunk.com/Splexicon:Fieldextraction
ソースタイプ作成/フィールド抽出の流れ
大まかには以下のような流れで実施します。
(1)ログ形式の確認(タイムスタンプ、文字コード、イベント区切りなどの確認)
(2)ソースタイプ作成とサンプルログのアップロード
(3)フィールド抽出の設定
(4)Forwarderへの設定反映
ラボで使うサンプルログ
サンプルログは以下とします。簡易的なものですがお試しなのでこれくらいにしておきます。
サンプルログ(ファイル名:labapp.logとしてローカルPCにコピペして保存しておいてください)
2025-09-23T14:30:25+09:00 [INFO] user:yamada action:login ip:192.168.1.100 result:success
2025-09-23T14:31:12+09:00 [INFO] user:tanaka action:login ip:192.168.1.101 result:success
2025-09-23T14:32:45+09:00 [WARN] user:sato action:login ip:10.0.0.15 result:failed
2025-09-23T14:33:22+09:00 [INFO] user:yamada action:access_file ip:192.168.1.100 result:success
2025-09-23T14:35:18+09:00 [INFO] user:suzuki action:login ip:192.168.1.102 result:success
2025-09-23T14:36:33+09:00 [ERROR] user:unknown action:login ip:203.0.113.45 result:blocked
2025-09-23T14:38:07+09:00 [INFO] user:tanaka action:logout ip:192.168.1.101 result:success
2025-09-23T14:39:41+09:00 [INFO] user:watanabe action:login ip:192.168.1.103 result:success
2025-09-23T14:41:15+09:00 [WARN] user:sato action:login ip:10.0.0.15 result:failed
2025-09-23T14:42:58+09:00 [INFO] user:kimura action:login ip:192.168.1.104 result:success
ソースタイプ作成/フィールド抽出の実施
では、サンプルログをSplunkにアップロードし、ソースタイプを作成してみます。用意するSplunk環境はEnterprise、Cloudどちらでも構いません。好きな環境でお試しください。
(1)ログ形式の確認(タイムスタンプ、文字コード、イベント区切りなど)
サンプルログを取得し、ログフォーマットの前提条件を確認します。
細かいところを網羅して確認していくのは大変なので、主に以下のような点を重視して確認していきます。[]内がパラメータ名です。
- タイムスタンプの場所とフォーマット[TIME_FORMAT]:
- 今回のログではタイムスタンプはログの先頭にあります。フォーマットは
yyyy-MM-ddTHH:mm:ss+HH:mmです。デフォルトではタイムスタンプやタイムゾーンは、splunkが柔軟に見つけようとしてくれるので、あまり細かく指定しなくても大丈夫な場合は多いのですが、もし間違って認識した場合はソースタイプ定義で明示する必要があります。
- 今回のログではタイムスタンプはログの先頭にあります。フォーマットは
- 文字コード[CHARSET]:
-
- 今回のログではUTF-8とします。デフォルトもUTF-8です。このためWindows OS上でログをモニターしている場合、明示的にSHIFT-JISを指定しなければならない可能性がありますので注意してください。(今回のサンプルログについても、Windowsで作業している場合はSHIFT-JISに変更する可能性があります)
- イベントの区切り(複数行をまとめて一つのイベントとして扱う必要があるか)[SHOULD_LINEMERGE]:
- 今回のログでは、一行が一イベントとし、複数イベントのマージは不要とします。一行が一イベントが確定している場合、マージ不要としたほうがパフォーマンスが上がります。ただエラーログなどは複数行にわたって出力される可能性があり、かつデフォルトではSplunkがある程度柔軟に改行を認識してくれるので、迷った場合はデフォルトのままにしておくと良いと思います。
他にも、イベントあたりの最大サイズを決めるTRUNCATEなどのパラメータがありますが、考え出すとキリがないので今回は省略します。
また、ソースタイプ名も最初に決定しておきます。今回はソースタイプ名は「lab_login」とします。
(2)ソースタイプ作成とサンプルログのアップロード
次に、サンプルログをSplunkのテストインデックスにアップロードし、(1)で確認した内容が適切か確認します。
「設定」-「データの追加」を選択します。
次の画面で「アップロード コンピュータのファイルから」を選択します。
次の画面で「labapp.log」をアップロードして「次へ」を選択すると、「ソースタイプの選択」画面が表示されます。
イベント改行、タイムスタンプ、詳細などのタブを選択すると、(1)で決めたパラメータを指定することができます。
ただ、今回はデフォルトのままで問題ないため、そのまま「名前をつけて保存」を選択し、ソースタイプ「lab_login」だけを指定してソースタイプを保存します。これでデフォルトパラメータを指定した状態でソースタイプの作成されます。
次の画面で、テスト用のインデックス「test-labapp」を指定してアップロードします。
無事にアップロードができたらサーチを実行し、(1)にて確認した、タイムスタンプ、文字コード、イベント区切りが適切に設定され、インデックスされていることを確認してください。
(3)フィールド抽出の設定
次に、サンプルログに対してフィールド抽出を設定します。
今回は、GUIによるフィールド抽出ウィザードを使ってフィールド抽出を試してみます。
Splunk Webより「設定」-「フィールド」を選択し「フィールド抽出」を選択し、「フィールド抽出機能を開く」を選択します。
以下を選択すると、画面下にlab_loginのイベントがサーチされて表示されます。
| 項目 | 値 |
|---|---|
| データタイプ | ソースタイプ |
| ソースタイプ | lab_login |
| 時間範囲 | 全期間 |
「_raw」から、適当に一つのイベントを選択すると次に進めるようになるので、「次へ」を選択します。
フィールド抽出を正規表現で決めるか、区切り文字で決めるか聞かれます。
区切り文字でフィールド抽出できるのはCSVなど特殊なフォーマットのみであるため、正規表現を選択し、「次へ」を選択します。
「フィールドの選択」画面で、GUI上でフィールドにマッピングしたい項目を反転させ、フィールド名を入力して「Add Extraction」を選択していきます。
今回は、timestamp、log_level、user、action、src_ip、resultをフィールドとして指定することにします。以下のような画面となります。
ここで、「正規表現を表示」を選択すると、現時点でsplunkが想定している正規表現を表示することが可能です。
「次へ」を選択します。
認証画面では、指定したフィールド抽出定義が問題ないか、サーチを実行したり、「一致」「不一致」などのタブを選択してイベントのフィルタリングをしたりして検証することができます。
「不一致」タブをクリックした際、表示されるイベントが0となっていることが理想です。今回は単純なログなので不一致ログは存在しませんが、複雑なフォーマットのログなどを実際にフィールド抽出する際は、ここで考慮しなければならないことが発生する場合も多いです。
「次へ」を選択し、フィールド抽出定義の名前(抽出名)と権限を指定して作成します。
抽出名は自動で勝手に作成されるので、そのまま保存してしまって構いませんが、権限はデフォルトの「オーナー」ではなく「すべてのApp」に変更しておきましょう。
(使い方によりますが、オーナーだけやAppだけに制限しないほうがいいと推測されます)
作成されたフィールド抽出定義は、「設定」-「フィールド」を選択し、「フィールド抽出」を選択することで一覧表示することができます。以下のようになっていることがわかります。
| 項目 | 値 |
|---|---|
| 名前 | lab_login:EXTRACT-timestamp,log_level,user,action,src_ip,result |
| タイプ | Inline |
| 抽出/変換 | ^(?P[^ ]+)\s+[(?P\w+)[^:\n]*:(?P[^ ]+) action:(?P\w+) ip:(?P[^ ]+)\s+\w+:(?P\w+) |
(4)Forwarderへの設定反映
最後に、Forwarder経由で取り込んだログのフィールドが抽出されることを確認したら完了です。
本番適用のため、新しくインデックス「labapp」を作成し、そこに本番データを格納することにします。
Forwarderへのログのモニター設定
touch /tmp/labapp.log
sudo /opt/splunkforwarder/bin/splunk add monitor /tmp/labapp.log -index labapp -sourcetype lab_login
ログの出力
echo "2025-09-23T14:46:12+09:00 [INFO] user:suzuki action:access_file ip:192.168.1.102 result:success
2025-09-23T14:47:35+09:00 [WARN] user:ito action:login ip:172.16.0.25 result:failed
2025-09-23T14:49:08+09:00 [INFO] user:watanabe action:upload_file ip:192.168.1.103 result:success
2025-09-23T14:50:44+09:00 [ERROR] user:admin action:system_config ip:192.168.1.200 result:errr
2025-09-23T14:52:17+09:00 [INFO] user:kimura action:logout ip:192.168.1.104 result:success
2025-09-23T14:53:29+09:00 [INFO] user:hayashi action:login ip:192.168.1.105 result:success
2025-09-23T14:55:03+09:00 [WARN] user:unknown action:brute_force ip:198.51.100.77 result:blocked
2025-09-23T14:56:38+09:00 [INFO] user:tanaka action:login ip:192.168.1.101 result:success
2025-09-23T14:58:14+09:00 [INFO] user:yamada action:logout ip:192.168.1.100 result:success
2025-09-23T15:00:22+09:00 [INFO] user:ito action:login ip:172.16.0.25 result:success
2025-09-23T15:01:55+09:00 [ERROR] user:system action:backup_failed ip:127.0.0.1 result:error
2025-09-23T15:03:31+09:00 [INFO] user:hayashi action:access_file ip:192.168.1.105 result:success
2025-09-23T15:05:18+09:00 [WARN] user:guest action:login ip:10.0.0.50 result:failed
2025-09-23T15:06:42+09:00 [INFO] user:suzuki action:logout ip:192.168.1.102 result:success
2025-09-23T15:08:27+09:00 [INFO] user:nakamura action:login ip:192.168.1.106 result:success
2025-09-23T15:10:13+09:00 [ERROR] user:admin action:db_connection ip:192.168.1.200 result:timeout
2025-09-23T15:11:55+09:00 [INFO] user:watanabe action:logout ip:192.168.1.103 result:success
2025-09-23T15:13:08+09:00 [WARN] user:unknown action:sql_injection ip:203.0.113.88 result:blocked
2025-09-23T15:14:44+09:00 [INFO] user:nakamura action:generate_report ip:192.168.1.106 result:success
2025-09-23T15:15:25+09:00 [INFO] user:suzuki action:access_file ip:192.168.1.102 result:success" >> /tmp/labapp.log
Splunk Webで実行するサーチコマンド(時間範囲は全時間で実行)
index=labapp sourcetype=labapp
実際にソースタイプ「lab_login」で取り込まれ、指定したフィールドが抽出されていることが確認できます。
参考資料
例のごとく公式ドキュメントは英語ばかりですが・・・・・・。
Why source types matter
https://help.splunk.com/en/splunk-cloud-platform/get-started/get-data-in/10.0.2503/configure-source-types/why-source-types-matter
Create source types
https://help.splunk.com/en/splunk-cloud-platform/get-started/get-data-in/10.0.2503/configure-source-types/create-source-types
Build field extractions with the field extractor
https://help.splunk.com/en/splunk-enterprise/manage-knowledge-objects/knowledge-management-manual/10.0/use-the-field-extractor-in-splunk-web/build-field-extractions-with-the-field-extractor
Use the Field extractions page
https://help.splunk.com/en/splunk-enterprise/manage-knowledge-objects/knowledge-management-manual/10.0/use-the-settings-pages-for-field-extractions-in-splunk-web/use-the-field-extractions-page











