ディスセクトプロセッサ
Grok Processorと同様に、ディスセクトはドキュメント内の単一のテキストフィールドから構造化されたフィールドを抽出します。しかし、Grok Processorとは異なり、ディスセクトは正規表現を使用しません。これにより、ディスセクトの構文はシンプルになり、場合によってはGrok Processorよりも高速になります。
ディスセクトは、定義されたパターンに対して単一のテキストフィールドを照合します。
例えば、次のパターン:
テキスト
%{clientip} %{ident} %{auth} [%{@timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}
この形式のログ行に一致します:
テキスト
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
"doc": {
"_index": "_index",
"_type": "_type",
"_id": "_id",
"_source": {
"request": "/english/venues/cities/images/montpellier/18.gif",
"auth": "-",
"ident": "-",
"verb": "GET",
"@timestamp": "30/Apr/1998:22:00:52 +0000",
"size": "3171",
"clientip": "1.2.3.4",
"httpversion": "1.0",
"status": "200"
}
}
分解パターンは、破棄される文字列の部分によって定義されます。前の例では、最初に破棄される部分は単一のスペースです。Dissect はこのスペースを見つけ、その後 clientip
の値をそのスペースまで割り当てます。次に、dissect は [
に一致し、その後 ]
に一致し、@timestamp
を [
と ]
の間のすべてに割り当てます。破棄する文字列の部分に特に注意を払うことで、成功した分解パターンを構築するのに役立ちます。
成功した一致には、パターン内のすべてのキーに値が必要です。パターン内で定義された%{keyname}
のいずれかに値がない場合、例外がスローされ、on_failure
ディレクティブによって処理される可能性があります。空のキー%{}
またはnamed skip keyを使用して値に一致させることができますが、最終的なドキュメントからその値を除外します。すべての一致した値は文字列データ型として表されます。convert processorを使用して期待されるデータ型に変換できます。
ディスセクトは、ディスセクトのデフォルトの動作を変更できるkey modifiersもサポートしています。たとえば、特定のフィールドを無視したり、フィールドを追加したり、パディングをスキップしたりするように指示できます。詳細については以下を参照してください。
名前 | 必須 | デフォルト | 説明 |
---|---|---|---|
field |
はい | - | ディスセクトするフィールド |
pattern |
はい | - | フィールドに適用するパターン |
append_separator |
いいえ | “” (空文字列) | 追加されたフィールドを区切る文字(s) |
ignore_missing |
いいえ | false | true およびfield が存在しないかnull の場合、プロセッサはドキュメントを変更せずに静かに終了します。 |
description |
いいえ | - | プロセッサの説明。プロセッサの目的や構成を説明するのに便利です。 |
if |
いいえ | - | プロセッサを条件付きで実行します。 プロセッサを条件付きで実行するを参照してください。 |
ignore_failure |
いいえ | false |
プロセッサの失敗を無視します。 パイプラインの失敗を処理するを参照してください。 |
on_failure |
いいえ | - | プロセッサの失敗を処理します。 パイプラインの失敗を処理するを参照してください。 |
tag |
いいえ | - | プロセッサの識別子。デバッグやメトリクスに便利です。 |
Js
{
"dissect": {
"field": "message",
"pattern" : "%{clientip} %{ident} %{auth} [%{@timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}"
}
}
ディスセクトキー修飾子
キー修飾子は、分解のデフォルトの動作を変更できます。キー修飾子は、常に %{keyname}
の左または右にあり、%{
と }
の内部にあります。たとえば、%{+keyname ->}
には追加および右パディング修飾子があります。
修飾子 | 名前 | 位置 | 例 | 説明 | 詳細 |
---|---|---|---|---|---|
-> |
右パディングをスキップ | (遠い) 右 | %{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 |