テックブログ

AWSのJSONログをjqで読みやすくする

こんにちは。運用チームのDIです。

AWSを使っていると、JSON形式のログを調査する場面がよくあります。
たとえば、次のようなログです。

  • CloudWatch Logsで取得したログ
  • CloudTrailのイベントログ
  • アプリケーションが出力したログ

JSONログは機械的に扱いやすく、内容がシンプルであれば人間でも比較的読みやすい形式です。
しかし、AWSサービスのログには、多くの情報が記録されています。
ログ件数が多かったり、階層が深かったりすると、目視で必要な情報を探すのは大変です。
そこで便利なのが jqコマンドです。
jqを使うと、JSONログを見やすく整形したり、必要な項目だけを抽出したり、条件に合うログだけを絞り込んだりできます。

jqとは

jqは、JSONをコマンドラインで扱うためのツールです。
例えば、下記のように1行で記録されたJSONログがあったとします。

{"timestamp":"2026-04-25T10:15:30+09:00","level":"INFO","service":"user-api","requestId":"req-001","path":"/users","statusCode":200,"message":"Get user list"}

このままでも内容は確認できますが、1行でまとまっていて少し読みづらいです。
ここで、次のようにjqを使います。

$ jq '.' json
{
  "timestamp": "2026-04-25T10:15:30+09:00",
  "level": "INFO",
  "service": "user-api",
  "requestId": "req-001",
  "path": "/users",
  "statusCode": 200,
  "message": "Get user list"
}

項目ごとにインデントされて見やすくなりました。
ここで指定している「.」は読み込んだJSONデータ全体を表します。
つまり、実行したコマンドは「JSONファイルの中身すべてを整形して表示する」という意味です。

必要な項目だけ抽出する

ログを調査するときは、JSON全体ではなく、特定の項目だけ確認したい場合があります。

例えば、エラー内容だけを確認したい場合は、次のように指定します。

$ jq '.message' json
"Get user list"

このように、jq を使うとJSONログの中から必要な項目だけを簡単に取り出せます。
複数項目を取り出す場合には、次のようにします。

$ jq '{level: .level, statusCode: .statusCode, message: .message}'
 json
{
  "level": "INFO",
  "statusCode": 200,
  "message": "Get user list"
}

ログ全体を見る必要がない場合は、調査に必要な項目だけを抽出すると確認しやすくなります。

条件に合うログだけを絞り込む

次は、複数件のログから条件に合うものだけを絞り込みます。
たとえば、下記のようなログがあるとします。

[
  {
    "timestamp": "2026-04-25T10:15:30+09:00",
    "level": "INFO",
    "service": "user-api",
    "requestId": "req-001",
    "path": "/users",
    "statusCode": 200,
    "message": "Get user list"
  },
  {
    "timestamp": "2026-04-25T10:16:05+09:00",
    "level": "ERROR",
    "service": "user-api",
    "requestId": "req-002",
    "path": "/users/123",
    "statusCode": 500,
    "message": "Failed to get user"
  }
]

今回のように、[ ] で囲まれているJSONは、配列形式のデータとなります。
このJSONログから、levelがERRORのログだけ取り出してみます。

$ jq '.[] | select(.level == "ERROR")' json
{
  "timestamp": "2026-04-25T10:16:05+09:00",
  "level": "ERROR",
  "service": "user-api",
  "requestId": "req-002",
  "path": "/users/123",
  "statusCode": 500,
  "message": "Failed to get user"
}

このようにERRORのログだけ表示することが出来ました。

$ jq '.[] | select(.level == "ERROR") | .message' json
"Failed to get user"

条件に合うログから、さらに必要な項目だけ取り出すこともできます。

まとめ

今回は、jq コマンドを使ってJSONログを整形・抽出・絞り込みする方法を紹介しました。

jqを使うと、JSONログの中から必要な情報を素早く確認できます。
特にAWS環境では、CloudWatch LogsやCloudTrail、アプリケーションログなど、JSON形式のログを扱う場面が多いため、覚えておくとログ調査がしやすくなるかなと思います。

今回は以上となります。
それでは、また。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください