🐶

ログの「見える化」入門: Grok Parser で非構造化ログを構造化する

に公開

はじめまして!Datadog で Sales Engineer をしている azush です。

突然ですが Datadog Log Explore にて、以下のような表示になってしまっているログはありませんか。

Datadog でログを分析する際、「非構造化ログ(いわゆる生ログ)」のままではフィルタリングやメトリクス化が難しく、せっかくのログデータを十分に活用できません。

そこで役立つのが、非構造化なテキストログを扱いやすい構造化ログへと変換する Grok Parser です。この記事では、Tips も交えながら Grok Parser の作成手順を解説します。

そもそも Grok Parser とは?

Grok Parser は、正規表現のプリセットである Grok Patterns を使って、ログの各要素をフィールドとして抽出する機能です(※Datadog 特有の機能ではありません)。ログの文字列を「IPアドレス」「日時」「ステータスコード」といった意味のあるパーツに分解し、それぞれに名前(キー)を付けて構造化します。

例えば、以下のような Web サーバーのログがあったとします。

192.168.1.1 - [13/Aug/2025:09:47:51 +0900] "GET /index.html HTTP/1.1" 200 1234

Grok Parser を使うことで、このログを以下のように構造化できます。

  • client_ip: 192.168.1.1
  • timestamp: 13/Aug/2025:09:47:51 +0900
  • method: GET
  • status_code: 200
  • bytes_sent: 1234

これにより、status_code:200のログだけを検索したり、bytes_sentの合計値をグラフ化したりといった高度な分析が可能になります。

Datadog のおける Grok Parser の作成手順

では実際に作成していきます。大筋は以下の通りです。

ステップ1: 対象のログに関するパイプラインを作成する
ステップ2: Grok Parser を作っていく
ステップ3: Log Explore でパース結果を確認する

ステップ1: 対象のログに関するパイプラインを作成する

ログパイプラインとは、Datadog に送られてくるログデータに対して、Grok Parser のような様々なプロセッサーを適用するための処理経路のことです。
まず、Grok Parser を適用するログにのみパイプラインを適用できるように設定します。

Datadog コンソール🐶

  1. Logs > Pipelines に移動
  2. 右上の New Pipeline をクリック
  3. Filter で対象となるログを絞り込む

ステップ2: Grok Parser を作っていく

Datadog コンソール🐶

  1. Add Processer をクリック
  2. Grok Parser を選択
  3. Log samples に対象のログを貼りつける

この記事で使用するサンプルログ

34.124.170.33 - - [13/Aug/2025:01:44:39 +0000] "GET /_next/data/development/en-US/product/cool-bits.json?slug=cool-bits HTTP/1.1" 200 2378 "https://lab-host-80-9jlp6yvdfuy1.env.play.instruqt.com/product/cool-bits" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"

パーサーを書いていく

まず、Define parsing rules に sample_parser_rule %{data:tmp} と記述し、ログ全体を 1 つの tmp キーにマッチさせます。この段階では、まだ特定の要素を抽出する必要はありません。

次に、ログの先頭から順番に、Datadog 公式ドキュメントを参照しながら、各要素を抽出するパース処理を記述していきます。

例えば今回の場合、冒頭は 34.124.170.33 と IP アドレスから始まるため、ip マッチャーを使用し、値を network.client.ip キーに対応させます。

sample_parser_rule %{ip:network.client.ip} %{data:tmp}

すると、先頭の IP アドレス部分だけが別キーとして抽出され、network.client.ip として値を扱えるようになりました。

IP アドレスの次は、日時データを抽出したいと考えますが、 - - [13/Aug/2025:01:44:39 +0000] のように記号やスペースを含んでいることが見て取れます。
この場合、スペースや記号もパーサーに含める必要があります。

sample_parser_rule %{ip:network.client.ip} \- \- \[%{data:tmp}

※記号の前にはバックスラッシュ \ が必要になります

- - [ の部分がなくなり、日時データが先頭にきていることが見て取れます。
日時データに関しても、同様に公式ドキュメントの日時パース規則を参照し、適切なルールを記述します。

sample_parser_rule %{ip:network.client.ip} \- \- \[%{date("dd/MMM/yyyy:HH:mm:ss Z"):date}\]%{data:tmp}

この繰り返しでパーサーの完成を目指します。残りの未処理のログ(%{data:tmp} に格納されている部分)を確認しながら、対応するマッチャーを公式ドキュメントで探し、パーサーを前から少しずつ書いていくことでより正確なパーサーを作成することができます。

今回の例における完成系

sample_parser_rule %{ip:network.client.ip} \- \- \[%{date("dd/MMM/yyyy:HH:mm:ss Z"):date}\] "%{word:http.method} %{notSpace:http.url} HTTP\/%{number:http.version}" %{number:http.status_code} %{integer:network.bytes_written} "%{notSpace:http.referer}" "%{data:http.useragent}"( "%{data:http.x_forwarded_for}")?

ステップ3: Log Explore でパース結果を確認する

Grok Parser 作成後に送られてくるログを確認し、Attributes として各キーに値がマッピングされていれば、パース処理完了になります。

補足: ログフォーマットが複数パターンある場合

Datadog の Patterns 機能を活用し、異なる形式のログがおおよそどのくらいあるのかを把握することができます。
また、グループ化された結果をクリックし、画面右上の Show Parsing Rule をクリックすることで、そのパターンのログに一致するパーサー例を得ることができます。

※ここで得られる例は、値が直書きされていたりするためそのまま流用するのではなく、上述のパーサー作成手順を参考にカスタマイズすることをおすすめします。

ここで、例えばエラーログの形式が通常ログとは異なっている場合、先ほど作成したパーサーでは抽出できなかったとします(サンプルログとして貼り付けると、NO MATCH になったとします)。

この場合は、2 つ目のパーサーを書いていく流れとなります。

おわりに

Grok Parserは、慣れるまで少し時間がかかるかもしれませんが、一度コツを掴んでしまえば、どんなログでも自由に構造化できるようになります。この記事が、皆さんのログ分析を次のレベルへ引き上げる一助となれば幸いです。
ぜひ、皆さんもご自身のログで Groker Parser の作成にチャレンジしてみてください。


余談
この記事で例示したログや環境は、Datadog 公式の学習教材をもとにしています。

今回ご紹介した Grok Parser の作成手順を実際に体験してみたい方は、Datadog Learning Center のラボ環境をご利用ください。無料で Datadog のコンソールにアクセスでき、実践的な演習を通して、この記事の内容をより深く理解することができます。

ぜひ、以下のリンクから「Build and Manage Log Pipelines」のコースをお試しください。
https://learn.datadoghq.com/courses/log-pipelines

Datadog Tech Blog

Discussion