AWS CLI を使用して CloudWatch のロググループ から ログを検索する

記事タイトルとURLをコピーする

山本です
こんにちは

そろそろ冬が終わってしまいますね
f:id:swx-yamamoto:20220407155835p:plain

さて
CloudWatch のロググループ から ログを検索したいということはよくあるかと思います
AWSマネジメントコンソールから検索できます
「JSONで出力して加工したい」といった要件から AWS CLI を使って検索結果を出力することもあるかと思います
この記事では AWS CLI を使用して CloudWatch のロググループ から ログを検索する方法を紹介します

そもそも AWSマネジメントコンソールで検索するには?

CloudWatchのロググループ画面 を開いて 右上の [Search log group]をクリックします
f:id:swx-yamamoto:20220407134827p:plain

※ログストリームごとに検索したい場合はログストリーム名をクリックして検索できます

フィルターバーに検索ワードを打ち込んで検索できます

f:id:swx-yamamoto:20220407160611p:plain

CSV出力もできます f:id:swx-yamamoto:20220407145949p:plain

AWS CLI を使用して CloudWatch のロググループ から ログを検索する

上と同等のことを AWS CLI を使用してやってみます
([Search log group]にあたる機能がないため少々コマンドが複雑になります ご了承ください)

前提

  • Bash 環境
  • AWS CLI v2以上
  • jq コマンド

コマンド

log_group_name=hoge #ロググループ名
search_string=fuga #検索文字列
max_items=37 #検索するログストリームの数
aws logs describe-log-streams --log-group-name $log_group_name --max-items $max_items --order-by LastEventTime --descending |jq '.logStreams[].logStreamName' |xargs aws logs filter-log-events --log-group-name $log_group_name --filter-pattern $search_string --log-stream-names

実行前に以下を確認してください

  • 「log_group_name」にはロググループ名を入れてください
  • 「search_string 」には検索する文字列を入れてください
  • 「max_items」は検索するログストリームの数です よしなに変更ください

利用しているコマンドの解説

  • describe-log-streams
    • ロググループにある最新のストリームの情報(json)を取得するために使用
  • jq
    • ログストリームの情報(json)からログストリーム名のリストを取得するために使用
  • filter-log-events
    • それぞれのログストリームから 検索文字列に一致するログを抽出するために使用

動作解説

  1. aws logs describe-log-streams を使い最新のログストリーム のリスト(json形式)取り出す (最大 $max_items 個のログストリームを格納したリスト)
  2. jq コマンドを使って 1 のリストからログストリーム名のみを抽出し文字列のリストにする
  3. aws logs filter-log-events コマンドの引数に 2 のリストからログストリーム名を 1つずつ渡し(xargs) 各ログストリームから検索文字列のイベントを取り出す

実行結果イメージ

search_string を error にして実行した結果画面
f:id:swx-yamamoto:20220407163007p:plain

まとめ

json で出力できるので 加工の幅が広がりそうですね
小ネタでした

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、サウナ、音楽鑑賞(J-Pops)、お笑い鑑賞(ラランド)