Whats'?
Amazon CloudWatch Logsに保存されたログを参照する方法について、まとめておきたいなと。
AWS CLI使用前提ですが。
環境
今回の環境は、こちらです。
$ aws --version
aws-cli/2.7.12 Python/3.9.11 Linux/5.4.0-121-generic exe/x86_64.ubuntu.20 prompt/off
AWSのクレデンシャルは、環境変数で設定しているものとします。
$ export AWS_ACCESS_KEY_ID=.....
$ export AWS_SECRET_ACCESS_KEY=.....
$ export AWS_DEFAULT_REGION=.....
aws logsでAmazon CloudWatch Logsに保存されたログを参照する
参照するドキュメントは、このあたりでしょう。
フィルターパターンを使用してログデータを検索する / AWS CLI を使用したログエントリの検索
ロググループの一覧を見る
ログを見るには、少なくともどのロググループを見るか決める必要があるわけですが。
ロググループの一覧を見るには、describe-log-groupsを使います。
$ aws logs describe-log-groups
リアルタイムにログを参照し続ける
いわゆるtail。--followで継続的にログを参照し続けます。
$ aws logs tail --follow [ロググループ名]
デフォルトで過去10分のログを参照するようですが、--sinceで調整可能なようです。
ログを絞り込むには、--filter-patternを使用します。
$ $ aws logs tail --follow [ロググループ名] --filter-pattern [フィルターパターン]
フィルターパターンの書式はこちら。
ログを検索する
ログイベントを表示するには、filter-log-eventsを使います。
$ aws logs filter-log-events --log-group-name [ロググループ名] [その他オプション]
実際の利用には、オプションをもう少し指定することになります。
よく使いそうなのは、このあたりでしょうか。
-
--filter-pattern… ログの絞り込み条件を指定 -
--start-time… 表示するログの開始時間をエポックで指定 -
--end-time… 表示するログの終了時間をエポックで指定
また、AWS CLI共通のオプションとして以下も利用することになるでしょう。
-
--query… AWS CLI側で結果のフィルタリングや関数適用を行う -
--output… 出力形式の指定
--queryはクライアント側のフィルタリングの仕組みで、サーバー側のフィルタリングは--filter-patternが相当します。
テンプレート的には、こんな感じで指定することになるのかな、と。
$ aws logs filter-log-events \
--log-group-name [ロググループ名] \
--filter-pattern [フィルターパターン] \
--start-time $(date [オプション指定]) \
--end-time $(date [オプション指定]) \
--query 'sort_by(events, ×tamp)[].{message:message}' \
--output text
以降、少し詳細を。
サーバー側のフィルタリングの指定
フィルターパターンの書式はこちら。
ログの中身がJSONの場合は、こちらを見るとよいでしょう。
フィルターとパターンの構文 / 語句を照合し、JSON ログイベントから値を抽出するメトリクスフィルターの使用
時間の指定
--start-timeおよび--end-timeの指定には、dateコマンドの結果を使うのが良いでしょう。
# 相対時間指定
$ date --date='15minutes ago' +%s%3N
# 絶対時間指定
$ date --date='2022-07-05 17:30:10' +%s000
クライアント側のフィルタリングの指定
AWS CLI 出力をフィルタリングする / クライアント側のフィルタリング
sort_byでソートしつつ、必要な項目に絞り込むとよいのではないでしょうか。
以下あたりですかね。
--query 'sort_by(events, ×tamp)[].{message:message}'
--query 'sort_by(events, ×tamp)[].{timestamp:timestamp,message:message}'
なお、絞り込まない場合の出力項目は以下になります。
- logStreamName
- timestamp
- message
- ingestionTime
- eventId
出力形式の指定
jsonまたはtextあたりを指定するとよいのかな、と。