ディスセクトプロセッサ

Grok Processorと同様に、ディスセクトはドキュメント内の単一のテキストフィールドから構造化されたフィールドを抽出します。しかし、Grok Processorとは異なり、ディスセクトは正規表現を使用しません。これにより、ディスセクトの構文はシンプルになり、場合によってはGrok Processorよりも高速になります。

ディスセクトは、定義されたパターンに対して単一のテキストフィールドを照合します。

例えば、次のパターン:

テキスト

  1. %{clientip} %{ident} %{auth} [%{@timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}

この形式のログ行に一致します:

テキスト

  1. 1.2.3.4 - - [30/Apr/1998:22:00:52 +0000] \"GET /english/venues/cities/images/montpellier/18.gif HTTP/1.0\" 200 3171

そして、次のフィールドを持つドキュメントが生成されます:

Js

  1. "doc": {
  2. "_index": "_index",
  3. "_type": "_type",
  4. "_id": "_id",
  5. "_source": {
  6. "request": "/english/venues/cities/images/montpellier/18.gif",
  7. "auth": "-",
  8. "ident": "-",
  9. "verb": "GET",
  10. "@timestamp": "30/Apr/1998:22:00:52 +0000",
  11. "size": "3171",
  12. "clientip": "1.2.3.4",
  13. "httpversion": "1.0",
  14. "status": "200"
  15. }
  16. }

分解パターンは、破棄される文字列の部分によって定義されます。前の例では、最初に破棄される部分は単一のスペースです。Dissect はこのスペースを見つけ、その後 clientip の値をそのスペースまで割り当てます。次に、dissect は [ に一致し、その後 ] に一致し、@timestamp[] の間のすべてに割り当てます。破棄する文字列の部分に特に注意を払うことで、成功した分解パターンを構築するのに役立ちます。

成功した一致には、パターン内のすべてのキーに値が必要です。パターン内で定義された%{keyname}のいずれかに値がない場合、例外がスローされ、on_failureディレクティブによって処理される可能性があります。空のキー%{}またはnamed skip keyを使用して値に一致させることができますが、最終的なドキュメントからその値を除外します。すべての一致した値は文字列データ型として表されます。convert processorを使用して期待されるデータ型に変換できます。

ディスセクトは、ディスセクトのデフォルトの動作を変更できるkey modifiersもサポートしています。たとえば、特定のフィールドを無視したり、フィールドを追加したり、パディングをスキップしたりするように指示できます。詳細については以下を参照してください。


表 13. ディスセクトオプション

名前 必須 デフォルト 説明
field はい - ディスセクトするフィールド
pattern はい - フィールドに適用するパターン
append_separator いいえ “” (空文字列) 追加されたフィールドを区切る文字(s)
ignore_missing いいえ false trueおよびfieldが存在しないかnullの場合、プロセッサはドキュメントを変更せずに静かに終了します。
description いいえ - プロセッサの説明。プロセッサの目的や構成を説明するのに便利です。
if いいえ - プロセッサを条件付きで実行します。 プロセッサを条件付きで実行するを参照してください。
ignore_failure いいえ false プロセッサの失敗を無視します。 パイプラインの失敗を処理するを参照してください。
on_failure いいえ - プロセッサの失敗を処理します。 パイプラインの失敗を処理するを参照してください。
tag いいえ - プロセッサの識別子。デバッグやメトリクスに便利です。

Js

  1. {
  2. "dissect": {
  3. "field": "message",
  4. "pattern" : "%{clientip} %{ident} %{auth} [%{@timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}"
  5. }
  6. }

ディスセクトキー修飾子

キー修飾子は、分解のデフォルトの動作を変更できます。キー修飾子は、常に %{keyname} の左または右にあり、%{} の内部にあります。たとえば、%{+keyname ->} には追加および右パディング修飾子があります。


表 14. ディスセクトキー修飾子

修飾子 名前 位置 説明 詳細
-> 右パディングをスキップ (遠い) 右 %{keyname1->} 右側の繰り返された文字をスキップします リンク
+ 追加 %{+keyname} %{+keyname} 2つ以上のフィールドを一緒に追加します link
+/n 順序付き追加 左と右 %{+keyname/2} %{+keyname/1} 指定された順序で2つ以上のフィールドを一緒に追加します link
? 名前付きスキップキー %{?ignoreme} 出力で一致した値をスキップします。%{}と同じ動作 link
*& 参照キー %{*r1} %{&r1} 出力キーを*の値として設定し、出力値を&として設定します link

右パディング修飾子 (-

>)

分解を実行するアルゴリズムは、パターン内のすべての文字がソース文字列と一致する必要があるという点で非常に厳格です。たとえば、パターン %{fookey} %{barkey} (1 スペース) は、文字列 “foobar” (1 スペース) に一致しますが、パターンには 1 スペースしかなく、ソース文字列には 2 スペースがあるため、文字列 “foobar” (2 スペース) には一致しません。

右パディング修飾子は、この場合に役立ちます。パターン %{fookey->} %{barkey} に右パディング修飾子を追加すると、”foobar” (1 スペース) と “foobar” (2 スペース) および “foobar” (10 スペース) に一致します。

右パディング修飾子を使用して、%{keyname->} の後の文字の繰り返しを許可します。

右パディング修飾子は、他の修飾子とともに任意のキーに配置できます。常に最も右の修飾子である必要があります。たとえば: %{+keyname/1->}%{->}

右パディング修飾子の例

パターン %{ts->} %{level}
入力 1998-08-10T17:15:42,466WARN
結果 - ts = 1998-08-10T17:15:42,466

- level = WARN

右パディング修飾子は、不要なデータをスキップするのに役立つ空のキーとともに使用できます。たとえば、同じ入力文字列ですが、ブラケットで囲まれている場合、同じ結果を得るには空の右パディングキーを使用する必要があります。

空のキーを持つ右パディング修飾子の例


| | |
| —- | —- |
| パターン | [%{ts}]%{->}[%{level}] |
| 入力 | [1998-08-10T17:15:42,466][WARN] |
| 結果 | - ts = 1998-08-10T17:15:42,466

- level = WARN |

追加修飾子 (+)

ディスセクトは、出力のために2つ以上の結果を一緒に追加することをサポートしています。値は左から右に追加されます。追加区切り文字を指定できます。この例では、追加区切り文字はスペースとして定義されています。

追加修飾子の例

パターン %{+name} %{+name} %{+name} %{+name}
入力 john jacob jingleheimer schmidt
結果 - name = john jacob jingleheimer schmidt

順序付き追加修飾子 (+ と /n)

ディスセクトは、出力のために2つ以上の結果を一緒に追加することをサポートしています。値は定義された順序(/n)に基づいて追加されます。追加区切り文字を指定できます。この例では、追加区切り文字はカンマとして定義されています。

順序付き追加修飾子の例

パターン %{+name/2} %{+name/4} %{+name/3} %{+name/1}
入力 john jacob jingleheimer schmidt
結果 - name = schmidt,john,jingleheimer,jacob

名前付きスキップキー (?)

ディスセクトは、最終結果で一致を無視することをサポートしています。これは空のキー%{}で行うことができますが、可読性のためにその空のキーに名前を付けることが望ましい場合があります。

名前付きスキップキー修飾子の例

パターン %{clientip} %{?ident} %{?auth} [%{@timestamp}]
入力 1.2.3.4 - - [30/Apr/1998:22:00:52 +0000]
結果 - clientip = 1.2.3.4

- @timestamp = 30/Apr/1998:22:00:52 +0000

参照キー (* と &)

ディスセクトは、解析された値を構造化されたコンテンツのキー/値ペアとして使用することをサポートしています。キー/値ペアで部分的にログを記録するシステムを想像してください。参照キーを使用すると、そのキー/値関係を維持できます。

参照キー修飾子の例

パターン [%{ts}] [%{level}] %{*p1}:%{&p1} %{*p2}:%{&p2}
入力 [2018-08-10T17:15:42,466] [ERR] ip:1.2.3.4 error:REFUSED
結果 - ts = 2018-08-10T17:15:42,466

- level = ERR

- ip = 1.2.3.4

- error = REFUSED