Grokプロセッサ

ドキュメント内の単一のテキストフィールドから構造化されたフィールドを抽出します。どのフィールドから一致したフィールドを抽出するか、また一致することを期待するgrokパターンを選択します。grokパターンは、再利用可能なエイリアス式をサポートする正規表現のようなものです。

このプロセッサには、多くの再利用可能なパターンがパッケージされています。

ログに一致するパターンを構築するのに助けが必要な場合は、Grokデバッガーツールが非常に便利です!Grokコンストラクタも便利なツールです。

パイプラインでのGrokプロセッサの使用


表23. Grokオプション

名前 必須 デフォルト 説明
field はい - grok式解析に使用するフィールド
patterns はい - 一致して名前付きキャプチャを抽出するためのgrok式の順序付きリスト。一致するリスト内の最初の式を返します。
pattern_definitions いいえ - 現在のプロセッサで使用されるカスタムパターンを定義するパターン名とパターンタプルのマップ。一致する既存の名前のパターンは、事前に定義された定義を上書きします。
ecs_compatibility いいえ disabled disabledまたはv1でなければなりません。v1の場合、プロセッサはElastic Common Schema (ECS)フィールド名を持つパターンを使用します。
trace_match いいえ false trueの場合、_ingest._grok_match_indexは一致したパターンが見つかったpatternsのインデックスとともに、あなたの一致したドキュメントのメタデータに挿入されます。
ignore_missing いいえ false trueおよびfieldが存在しないかnullの場合、プロセッサはドキュメントを変更せずに静かに終了します。
description いいえ - プロセッサの説明。プロセッサの目的や構成を説明するのに便利です。
if いいえ - プロセッサを条件付きで実行します。プロセッサを条件付きで実行するを参照してください。
ignore_failure いいえ false プロセッサの失敗を無視します。パイプラインの失敗を処理するを参照してください。
on_failure いいえ - プロセッサの失敗を処理します。パイプラインの失敗を処理するを参照してください。
tag いいえ - プロセッサの識別子。デバッグやメトリクスに便利です。

ここに、提供されたパターンを使用してドキュメント内の文字列フィールドから構造化されたフィールドを抽出して名前を付ける例があります。

Python

  1. resp = client.ingest.simulate(
  2. pipeline={
  3. "description": "...",
  4. "processors": [
  5. {
  6. "grok": {
  7. "field": "message",
  8. "patterns": [
  9. "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes:int} %{NUMBER:duration:double}"
  10. ]
  11. }
  12. }
  13. ]
  14. },
  15. docs=[
  16. {
  17. "_source": {
  18. "message": "55.3.244.1 GET /index.html 15824 0.043"
  19. }
  20. }
  21. ],
  22. )
  23. print(resp)

Ruby

  1. response = client.ingest.simulate(
  2. body: {
  3. pipeline: {
  4. description: '...',
  5. processors: [
  6. {
  7. grok: {
  8. field: 'message',
  9. patterns: [
  10. '%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes:int} %{NUMBER:duration:double}'
  11. ]
  12. }
  13. }
  14. ]
  15. },
  16. docs: [
  17. {
  18. _source: {
  19. message: '55.3.244.1 GET /index.html 15824 0.043'
  20. }
  21. }
  22. ]
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.ingest.simulate({
  2. pipeline: {
  3. description: "...",
  4. processors: [
  5. {
  6. grok: {
  7. field: "message",
  8. patterns: [
  9. "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes:int} %{NUMBER:duration:double}",
  10. ],
  11. },
  12. },
  13. ],
  14. },
  15. docs: [
  16. {
  17. _source: {
  18. message: "55.3.244.1 GET /index.html 15824 0.043",
  19. },
  20. },
  21. ],
  22. });
  23. console.log(response);

コンソール

  1. POST _ingest/pipeline/_simulate
  2. {
  3. "pipeline": {
  4. "description" : "...",
  5. "processors": [
  6. {
  7. "grok": {
  8. "field": "message",
  9. "patterns": ["%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes:int} %{NUMBER:duration:double}"]
  10. }
  11. }
  12. ]
  13. },
  14. "docs":[
  15. {
  16. "_source": {
  17. "message": "55.3.244.1 GET /index.html 15824 0.043"
  18. }
  19. }
  20. ]
  21. }

このパイプラインは、これらの名前付きキャプチャをドキュメント内の新しいフィールドとして挿入します。次のように:

コンソール-結果

  1. {
  2. "docs": [
  3. {
  4. "doc": {
  5. "_index": "_index",
  6. "_id": "_id",
  7. "_version": "-3",
  8. "_source" : {
  9. "duration" : 0.043,
  10. "request" : "/index.html",
  11. "method" : "GET",
  12. "bytes" : 15824,
  13. "client" : "55.3.244.1",
  14. "message" : "55.3.244.1 GET /index.html 15824 0.043"
  15. },
  16. "_ingest": {
  17. "timestamp": "2016-11-08T19:43:03.850+0000"
  18. }
  19. }
  20. }
  21. ]
  22. }

カスタムパターン

Grokプロセッサには、基本的なパターンのセットがあらかじめパッケージされています。これらのパターンには、必ずしもあなたが探しているものが含まれているわけではありません。パターンは非常に基本的な形式を持っています。各エントリには名前とパターン自体があります。

  1. #### Js
  2. ``````js
  3. {
  4. "description" : "...",
  5. "processors": [
  6. {
  7. "grok": {
  8. "field": "message",
  9. "patterns": ["my %{FAVORITE_DOG:dog} is colored %{RGB:color}"],
  10. "pattern_definitions" : {
  11. "FAVORITE_DOG" : "beagle",
  12. "RGB" : "RED|GREEN|BLUE"
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. `

複数の一致パターンの提供

時には、1つのパターンではフィールドの潜在的な構造をキャプチャするには不十分です。あなたのお気に入りのペットの品種である猫または犬を含むすべてのメッセージに一致させたいと仮定しましょう。これを達成する1つの方法は、同じorの動作をキャプチャする非常に複雑な式の代わりに、一致できる2つの異なるパターンを提供することです。

ここに、simulate APIに対して実行されたそのような構成の例があります:

Python

  1. resp = client.ingest.simulate(
  2. pipeline={
  3. "description": "parse multiple patterns",
  4. "processors": [
  5. {
  6. "grok": {
  7. "field": "message",
  8. "patterns": [
  9. "%{FAVORITE_DOG:pet}",
  10. "%{FAVORITE_CAT:pet}"
  11. ],
  12. "pattern_definitions": {
  13. "FAVORITE_DOG": "beagle",
  14. "FAVORITE_CAT": "burmese"
  15. }
  16. }
  17. }
  18. ]
  19. },
  20. docs=[
  21. {
  22. "_source": {
  23. "message": "I love burmese cats!"
  24. }
  25. }
  26. ],
  27. )
  28. print(resp)

Ruby

  1. response = client.ingest.simulate(
  2. body: {
  3. pipeline: {
  4. description: 'parse multiple patterns',
  5. processors: [
  6. {
  7. grok: {
  8. field: 'message',
  9. patterns: [
  10. '%{FAVORITE_DOG:pet}',
  11. '%{FAVORITE_CAT:pet}'
  12. ],
  13. pattern_definitions: {
  14. "FAVORITE_DOG": 'beagle',
  15. "FAVORITE_CAT": 'burmese'
  16. }
  17. }
  18. }
  19. ]
  20. },
  21. docs: [
  22. {
  23. _source: {
  24. message: 'I love burmese cats!'
  25. }
  26. }
  27. ]
  28. }
  29. )
  30. puts response

Js

  1. const response = await client.ingest.simulate({
  2. pipeline: {
  3. description: "parse multiple patterns",
  4. processors: [
  5. {
  6. grok: {
  7. field: "message",
  8. patterns: ["%{FAVORITE_DOG:pet}", "%{FAVORITE_CAT:pet}"],
  9. pattern_definitions: {
  10. FAVORITE_DOG: "beagle",
  11. FAVORITE_CAT: "burmese",
  12. },
  13. },
  14. },
  15. ],
  16. },
  17. docs: [
  18. {
  19. _source: {
  20. message: "I love burmese cats!",
  21. },
  22. },
  23. ],
  24. });
  25. console.log(response);

コンソール

  1. POST _ingest/pipeline/_simulate
  2. {
  3. "pipeline": {
  4. "description" : "parse multiple patterns",
  5. "processors": [
  6. {
  7. "grok": {
  8. "field": "message",
  9. "patterns": ["%{FAVORITE_DOG:pet}", "%{FAVORITE_CAT:pet}"],
  10. "pattern_definitions" : {
  11. "FAVORITE_DOG" : "beagle",
  12. "FAVORITE_CAT" : "burmese"
  13. }
  14. }
  15. }
  16. ]
  17. },
  18. "docs":[
  19. {
  20. "_source": {
  21. "message": "I love burmese cats!"
  22. }
  23. }
  24. ]
  25. }

レスポンス:

コンソール-結果

  1. {
  2. "docs": [
  3. {
  4. "doc": {
  5. "_index": "_index",
  6. "_id": "_id",
  7. "_version": "-3",
  8. "_source": {
  9. "message": "I love burmese cats!",
  10. "pet": "burmese"
  11. },
  12. "_ingest": {
  13. "timestamp": "2016-11-08T19:43:03.850+0000"
  14. }
  15. }
  16. }
  17. ]
  18. }

両方のパターンは、適切な一致でフィールドpetを設定しますが、どのパターンが一致してフィールドを埋めたかを追跡したい場合はどうすればよいでしょうか?trace_matchパラメータを使用してこれを行うことができます。"trace_match": trueが構成された同じパイプラインの出力は次のとおりです:

コンソール-結果

  1. {
  2. "docs": [
  3. {
  4. "doc": {
  5. "_index": "_index",
  6. "_id": "_id",
  7. "_version": "-3",
  8. "_source": {
  9. "message": "I love burmese cats!",
  10. "pet": "burmese"
  11. },
  12. "_ingest": {
  13. "_grok_match_index": "1",
  14. "timestamp": "2016-11-08T19:43:03.850+0000"
  15. }
  16. }
  17. }
  18. ]
  19. }

上記のレスポンスでは、一致したパターンのインデックスが"1"であることがわかります。これは、patternsの2番目(インデックスはゼロから始まる)パターンが一致したことを意味します。

このトレースメタデータは、どのパターンが一致したかをデバッグするのに役立ちます。この情報は、インジェストメタデータに保存され、インデックスには登録されません。

RESTエンドポイントからのパターンの取得

Grokプロセッサには、プロセッサに含まれるパターンを取得するための独自のRESTエンドポイントがパッケージされています。

Python

  1. resp = client.ingest.processor_grok()
  2. print(resp)

Ruby

  1. response = client.ingest.processor_grok
  2. puts response

Js

  1. const response = await client.ingest.processorGrok();
  2. console.log(response);

コンソール

  1. GET _ingest/processor/grok

上記のリクエストは、組み込みパターン辞書のキーと値の表現を含むレスポンスボディを返します。

Js

  1. {
  2. "patterns" : {
  3. "BACULA_CAPACITY" : "%{INT}{1,3}(,%{INT}{3})*",
  4. "PATH" : "(?:%{UNIXPATH}|%{WINPATH})",
  5. ...
  6. }

デフォルトでは、APIはレガシーGrokパターンのリストを返します。これらのレガシーパターンは、Elastic Common Schema (ECS)より前のもので、ECSフィールド名を使用していません。ECSフィールド名を抽出するパターンを返すには、オプションのv1クエリパラメータにv1を指定します。

Python

  1. resp = client.ingest.processor_grok(
  2. ecs_compatibility="v1",
  3. )
  4. print(resp)

Ruby

  1. response = client.ingest.processor_grok(
  2. ecs_compatibility: 'v1'
  3. )
  4. puts response

Js

  1. const response = await client.ingest.processorGrok({
  2. ecs_compatibility: "v1",
  3. });
  4. console.log(response);

コンソール

  1. GET _ingest/processor/grok?ecs_compatibility=v1

デフォルトでは、APIはディスクから読み取られる順序でパターンを返します。このソート順は、関連するパターンのグループを保持します。たとえば、Linux syslog行の解析に関連するすべてのパターンは一緒にグループ化されます。

オプションのブールsクエリパラメータを使用して、返されたパターンをキー名でソートすることもできます。

Python

  1. resp = client.ingest.processor_grok(
  2. s=True,
  3. )
  4. print(resp)

Ruby

  1. response = client.ingest.processor_grok(
  2. s: true
  3. )
  4. puts response

Js

  1. const response = await client.ingest.processorGrok({
  2. s: "true",
  3. });
  4. console.log(response);

コンソール

  1. GET _ingest/processor/grok?s

APIは次のレスポンスを返します。

Js

  1. {
  2. "patterns" : {
  3. "BACULA_CAPACITY" : "%{INT}{1,3}(,%{INT}{3})*",
  4. "BACULA_DEVICE" : "%{USER}",
  5. "BACULA_DEVICEPATH" : "%{UNIXPATH}",
  6. ...
  7. }

これは、組み込みパターンがバージョンごとに変更されるため、参照するのに役立ちます。

Grokウォッチドッグ

実行に時間がかかりすぎるgrok式は中断され、grokプロセッサは例外で失敗します。grokプロセッサには、grok式の評価が長すぎるかどうかを判断するウォッチドッグスレッドがあり、次の設定によって制御されます:


表24. Grokウォッチドッグ設定

名前 デフォルト 説明
ingest.grok.watchdog.interval 1s 最大許可実行時間を超えるgrok評価があるかどうかをチェックする頻度。
ingest.grok.watchdog.max_execution_time 1s grok式評価の最大許可実行時間。

Grokデバッグ

grokパターンをデバッグするには、Grokデバッガーを使用することをお勧めします。そこから、サンプルデータに対してUIで1つまたは複数のパターンをテストできます。内部では、インジェストノードプロセッサと同じエンジンを使用しています。

さらに、Grokのデバッグログを有効にして、追加のメッセージがElasticsearchサーバーログに表示されるようにすることをお勧めします。

Js

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "logger.org.elasticsearch.ingest.common.GrokProcessor": "debug"
  5. }
  6. }