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, ×tamp)[].{timestamp:timestamp,message:message}"」とすれば、timestampとmessageのみをJSON形式で出力することができます。
messageだけを出力したい場合は、「--query "sort_by(events, ×tamp)[].{message:message}"」と指定すればJSON形式で出力されます。
以下コマンドと出力例です。(timestampだけ表示したい人はいないと思いますが)
aws logs filter-log-events \
--log-group-name "/aws/lambda/hogeLambda" \
--start-time 1600016756000 \
--query "sort_by(events,×tamp)[].{timestamp:timestamp}"
出力結果
[
{
"timestamp": 1602379289492
},
{
"timestamp": 1602379289973
}
]
以下コマンドでタイムスタンプとメッセージを表示することができます。
aws logs filter-log-events \
--log-group-name "/aws/lambda/hogeLambda" \
--start-time 1600016756000 \
--query "sort_by(events,×tamp)[].{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, ×tamp)[].{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, ×tamp)[].{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, ×tamp)[].{timestamp:timestamp,message:message}" \
| jq -r

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント