本章では、OpenObserveに取り込んだログデータを解析する方法について説明します。
OpenObserveでは、取り込んだログに対してファンクションを適用し、ログ本文から必要な情報を取り出すことができます。
7.1. データ解析機能の概要
OpenObserveに取り込まれたログは、ログ検索画面で検索できます。
ただし、ログ本文が1つの文字列として保存されている場合、ログの中に含まれる情報を条件として利用しにくい場合があります。例えば以下のようなログがある場合、ログ本文の中には日時、ホスト名、プロセス名、メッセージなどの情報が含まれています。
Jun xx xx:xx:xx linux kernel: CIFS: Attempting to mount //192.168.2.134/share
このようなログをそのまま扱う場合、ログ本文に対してキーワード検索を行うことはできますが、プロセス名やメッセージ部分だけを条件にして検索したり、特定の項目ごとに集計したりする場合は、ログを項目ごとに分けて扱えるようにしておく必要があります。
ログデータを解析して項目ごとに分けることで、以下のような操作を行いやすくなります。
- 特定のプロセス名を条件にしてログを検索する
- 特定のメッセージを含むログだけを確認する
- ホスト名やプロセス名ごとにログ件数を集計する
- ダッシュボードやアラートの条件として利用する
ログを項目ごとに扱えるようにしておくことで、ログ本文全体に対するキーワード検索だけでなく、特定の項目を条件にした検索や可視化を行いやすくなります。
7.2. ファンクションについて
OpenObserveでは、ログデータを解析するためにファンクションを利用できます。ファンクションは、取り込まれたログデータに対して処理を行うための仕組みです。
ログデータは、収集方法やログの種類によって形式が異なります。例えば、ログ本文がbodyフィールドに1つの文字列として保存されている場合、ログの中に含まれるプロセス名やメッセージなどを、そのまま個別の条件として利用することはできません。
ファンクションを利用すると、ログ本文に対して処理を行い、検索や集計で扱いやすい形式に整えることができます。そのため、ログ本文全体に対するキーワード検索だけでなく、ログ内の特定の要素を利用した検索や可視化を行いやすくなります。
ファンクションは、対象となるログの形式に合わせて作成します。ログ形式が想定と異なる場合、期待した結果にならないことがあるため、対象とするログの内容を確認した上で利用します。
7.3. VRL
OpenObserveでは、VRLを利用してログデータを解析できます。
7.3.1. VRLとは
VRL(Vector Remap Language) は、もともとデータシッパーであるVectorのプロジェクトで開発・導入された言語です。Vectorでも、受け取ったデータを変更・追加・削除などを行うために利用します。
VRLは多くの機能を持つため、すべての機能について知りたい場合は、以下公式マニュアルを参照してください。
VRLは、vectorの起動時にRust言語に変換・コンパイルされて動作します。このため、他のソフトウェアでよくある、Node.jsやPython、Luaのようなスクリプト言語で動作する変換器とは異なり、非常に高速に動作します。
7.3.2. VRL内でのデータの取扱い
VRLでは、ログを一つのオブジェクトとして扱います。そして、ログは . (ドット)として表現されます。例えば、次のようなオブジェクトがあるとします。
{
"status": 200,
"timestamp": "2026-06-01T19:19:24.646170Z",
"message": "SUCCESS",
"username": "ub40fan4life"
}
このオブジェクト全体が . (ドット)と表現され、その配下にあるフィールドには .status や .timestamp などのようにアクセスできます。
7.3.3. データの代入
VRL内では、オブジェクトにデータを代入することができます。例えば、以下のように新しいフィールドを定義することができます。
# 文字列の代入
.sample = "sample message"
# 新しいオブジェクトの生成
.sample_obj = {}
また、既存のフィールドを上書きすることもできます。以下は .timestamp に格納されている日付情報を、Unixタイムスタンプに変換し、再代入する例です。
.timestamp = to_unix_timestamp!(.timestamp)
7.3.4. データ形式
VRLで利用できるデータ形式は以下の通りです。
# Integer(数値)
.int = 100
.int = 1_000_000
# Float(小数)
.float = 0.1
# String(文字列)
.str = "string"
# Array(配列)
.arr = ["str", 0]
.arr = ["str", 0]
# Boolean(論理値)
.bool = true
.bool = false
# Object(オブジェクト)
.obj = {"field": "value"}
# Regular Expression(正規表現)
.regexp = r'^Hello, World!$'
7.3.5. 式
VRLで利用できる主な式は以下の通りです。
# 加算
val = 1 + 1
str = "Hello " + "World"
# 減算
val = 2 - 1
# 乗算
val = 2 * 2
# 除算
val = 4 / 2
7.3.7. 論理演算子
VRLで利用できる論理演算子は以下の通りです。
7.3.8. 条件式
VRLでは、以下のように if 、 else 、 else if を使って条件分岐を行うことができます。
if (x == 1) {
"Hello, World1"
} else if (x == 2) {
"Hello, World2"
} else {
null
}
7.5. ログデータをフィールド分解する
本章では、ファンクションを作成し、ログ本文をフィールドに分解する方法を記載します。例として、messagesストリームに保存されたログの body フィールドから、プロセス名とメッセージ部分を取り出すためのファンクションを作成します。
対象となるログは以下の通りです。
Jun 17 17:00:02 linux kernel: CIFS: Attempting to mount //192.168.2.134/share
このログでは、 kernel がプロセス名に相当し、 CIFS: Attempting to mount //192.168.2.134/share がメッセージ部分に相当します。
ファンクションを利用して、これらの値を新しいフィールドとして追加します。
抽出する項目の例は以下の通りです。
抽出する項目の例
| フィールド名 |
内容 |
| process_name |
ログを出力したプロセス名を格納します。例では kernel を格納します。 |
| messages |
ログ本文のメッセージ部分を格納します。例では CIFS: Attempting to mount //192.168.2.134/share を格納します。 |
ファンクションを作成するには、OpenObserveのメニューから パイプライン -> 関数 の順にクリックするか、 ホーム画面中央の 関数 をクリックします。
ファンクションの一覧画面が表示されるため、画面右上の 関数を作成 をクリックします。
以下の項目を設定します。
- 名前
- 作成するファンクションの名を指定します。管理画面上に表されます。
- VRLファンクション
- ログ本文を解析するための処理を記述します。例えば、ログ本文がbodyフィールドに保存されている場合、以下のようなVRLを設定します。
parsed = parse_regex!(.body, r'^\w+\s+\d+\s+\d+:\d+:\d+\s+\S+\s+(?P<process_name>[^[:]+)(?:[\d+])?:\s+(?P<message>.*)$')
.process_name = parsed.process_name
.message = parsed.message
上記の例では、body フィールドに格納されたログ本文を正規表現で解析し、以下のフィールドを追加しています。
追加するフィールド
| フィールド名 |
内容 |
| process_name |
ログを出力したプロセス名を格納します。例では kernel を格納します。 |
| messages |
ログ本文のメッセージ部分を格納します。例では CIFS: Attempting to mount //192.168.2.134/share を格納します。 |
- イベント
- ファンクションのテストに使用するサンプルデータを指定します。実際に取り込まれるログに近い形式のデータを指定し、VRLのテストを行う際に使用します。上記VRLに合わせる場合、以下をイベントに指定します。
[
{
"_timestamp": 1735128523652186,
"body": "Jun 17 17:00:02 linux kernel: CIFS: Attempting to mount //192.168.2.134/share"
}
]
- 出力
- ファンクションをテストした結果が表示されます。作成したファンクションにより、想定したフィールドが追加されているか確認します。
設定が完了したら 関数をテスト をクリックしテストを行い、出力内容に問題なければ 保存 をクリックします。
ファンクション作成後は、ログ検索画面にて、対象のログにファンクションを適用します。