AWS CloudWatch Logsコマンドチートシート

AWS CloudWatch Logsコマンドチートシート

CloudWatchのログはCloudWatchインサイトなどの便利な機能もありますが、マネジメントコンソールからだとどうしても見にくいのでCLIで開始と終了を指定して整形してあげれば非常に見やすくすることが可能です。

ロググループをaws logs --log-group-nameでロググループを指定指定して出力します。Amazon Linuxで試しました。

Lambda名 環境
hogeLambda Amazon Linux

aws logs filter-log-eventsコマンドを使用します。

aws logs filter-log-events \
  --log-group-name "/aws/lambda/hogeLambda" \
  --start-time $(date --date='2020-11-10T23:18:00+09:00' +%s000) \
  --end-time $(date --date='2020-11-10T23:20:00+09:00' +%s000)

--end-timeを指定しなければ現在時刻までのログが出力されます。+%s000としているのはミリ秒まで指定が必要なためです。+%s%3NでもOKです。

CloudWatchで表示される項目は以下のJSON形式です。

{
  "searchedLogStreams": [
    {
      "searchedCompletely": "全てのログを検索したかどうか", // true or false
      "logStreamName": "ログストリーム名"
    }
    // ...オブジェクトが続く
  ],
  "events": [
    {
      "ingestionTime": "Cloud Watch Logsに受信されたタイムスタンプ(13桁のエポック秒)",
      "timestamp": "タイムスタンプ(13桁のエポック秒)",
      "message": "ログ出力内容",
      "eventId": "イベントID",
      "logStreamName": "ログストリーム名"
    }
    // ...オブジェクトが続く
  ]
}

--queryオプションで表示を指定する

必要な情報のみ出力したい場合は–queryオプションを指定します。ここではtimestampとmessageのみ出力してみます。

--query "sort_by(events, &timestamp)[].{timestamp:timestamp,message:message}"」とすれば、timestampとmessageのみをJSON形式で出力することができます。

messageだけを出力したい場合は、「--query "sort_by(events, &timestamp)[].{message:message}"」と指定すればJSON形式で出力されます。

以下コマンドと出力例です。(timestampだけ表示したい人はいないと思いますが)

aws logs filter-log-events \
  --log-group-name "/aws/lambda/hogeLambda" \
  --start-time 1600016756000 \
  --query "sort_by(events,&timestamp)[].{timestamp:timestamp}"

出力結果

[
  {
    "timestamp": 1602379289492
  },
  {
    "timestamp": 1602379289973
  }
]

以下コマンドでタイムスタンプとメッセージを表示することができます。

aws logs filter-log-events \
  --log-group-name "/aws/lambda/hogeLambda" \
  --start-time 1600016756000 \
  --query "sort_by(events,&timestamp)[].{timestamp:timestamp,message:message}"

--filter-pattern

--filter-pattern "keyword"を指定すると特定のログイベントを検索、指定した条件に一致するログエントリのみを抽出することができます。

aws logs filter-log-events \
  --log-group-name "/aws/lambda/hogeLambda" \
  --filter-pattern "RawContent" \
  --start-time $(date --date='2020-11-10T23:18:00+09:00' +%s000) \
  --end-time $(date --date='2020-11-10T23:20:00+09:00' +%s000)

出力結果

[
  {
    "timestamp": 1600000000000,
    "message": "RawContent: '{\"hoge\":\"fuga\"}}'\n"
  }
]

--output

–outputで出力形式を指定します。省略するとjsonになります。

aws logs filter-log-events \
 --log-group-name "/aws/lambda/hogeLambda" \
 --filter-pattern "ERROR" \
 --start-time $(date --date='2020-11-10T20:11:22+09:00' +%s000) \
 --end-time $(date --date='2020-11-10T20:22:33+09:00' +%s000) \
 --query "sort_by(events, &timestamp)[].{timestamp:timestamp,message:message}" \
 --output json

jsonの他に、text,tableが指定できます。

xx分前~今までのログ

--start-timeに3分前の13桁のエポック秒を指定します。--end-timeは未指定にします。

date --date='3minutes ago' +%s%3N

このコマンドで13桁のエポック秒が取得できます。

以下コマンドで3分前から今までのログを取得することができます。

aws \
logs filter-log-events \
--log-group-name "/aws/lambda/hogeLambda" \
--start-time $(date --date='3minutes ago' +%s%3N) \
--query "sort_by(events, &timestamp)[].{timestamp:timestamp,message:message}"

jq -rを付ける

最後にパイプでjq -rコマンドを付けるときれいに表示されます。

aws \
logs filter-log-events \
--log-group-name "/aws/lambda/hogeLambda" \
--start-time $(date --date='3minutes ago' +%s%3N) \
--query "sort_by(events, &timestamp)[].{timestamp:timestamp,message:message}" \
 | jq -r

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました