目次
CloudWatchを利用したログ確認
1. 目的
本番環境で 500 エラーやシステム異常が発生した際に、
CloudWatch だけで原因(例外・スタックトレース・該当API)を特定するための手順。
2. ログ構成(前提)
- アプリ業務ログ:
/kosmos/api/prod
API呼び出し、URI、requestId(JSON形式) - サーバ例外ログ:
/kosmos/tomcat/prod
Java例外、スタックトレース(catalina.out)
※ 冗長化構成でも、すべてのインスタンスを横断して確認できる。
※ @logStream = EC2インスタンスID
3. 基本調査フロー(必ずこの順)
STEP 1:例外(スタックトレース)を確認
ロググループ:/kosmos/tomcat/prod
fields @timestamp, @logStream, @message
| filter @message like /Exception|SEVERE|エラー|ERROR/
| sort @timestamp desc
| limit 50
確認ポイント:
- 例外クラス名(NullPointerException / SQLException 等)
com.kosmos...のクラス・行番号- 発生時刻
- 発生インスタンス(@logStream)
※ ここでほぼ原因が特定できる
STEP 2:同時刻の API を特定
ロググループ:/kosmos/api/prod
fields @timestamp, @logStream, @message
| filter @message like /ENTER uri=/
| sort @timestamp desc
| limit 50
確認ポイント:
- どの URI が呼ばれていたか
- どのインスタンスで処理されたか
STEP 3:requestId がある場合は追跡
fields @timestamp, @logStream, @message
| filter @message like /requestId=/
| sort @timestamp asc
ENTER → 処理 → 例外発生、の流れを時系列で確認できる。
4. インスタンス起因かの切り分け
fields @logStream
| filter @message like /Exception|SEVERE|ERROR/
| stats count() as errorCount by @logStream
| sort errorCount desc
- 特定1台のみ → インスタンス固有問題
- 全台で発生 → アプリ/DB/外部連携の問題
5. よくある判断例
- 例外+行番号あり → 実装バグ/データ不整合
- SQL例外 → DB障害/データ異常
- タイムアウト → 外部API/DB遅延
- 同一インスタンスのみ → メモリ枯渇/一時不調
6. 注意点
- ERRORログが無い = 障害が無い、ではない
- 例外の実体は
/kosmos/tomcat/prodを必ず確認する - 業務フロー確認は
/kosmos/api/prod - SSHでのログ確認は原則不要(CloudWatchを正とする)
7. まとめ
- Tomcatログで例外を見る
- APIログで URI を確認
- requestId と instanceId で紐付け
- 原因を特定する
CloudWatch Logs Insights クエリ集
Tomcat(例外・起動・インスタンス切り分け)
直近の例外(Exception / SEVERE / ERROR)を見る
Log Group: /kosmos/tomcat/prod
fields @timestamp, @logStream, @message
| filter @message like /Exception|ERROR|SEVERE/
| sort @timestamp desc
| limit 50
特定例外名で検索する(例:NullPointerException)
Log Group: /kosmos/tomcat/prod
fields @timestamp, @logStream, @message
| filter @message like /NullPointerException/
| sort @timestamp desc
| limit 20
インスタンス別にエラー件数を集計する(切り分け)
Log Group: /kosmos/tomcat/prod
fields @logStream
| filter @message like /Exception|ERROR|SEVERE/
| stats count() as errorCount by @logStream
| sort errorCount desc
時間帯別にエラー件数を見る(5分単位)
Log Group: /kosmos/tomcat/prod
fields @timestamp
| filter @message like /Exception|ERROR|SEVERE/
| stats count() as errorCount by bin(5m)
| sort @timestamp asc
Tomcat 起動時ログを確認する(startup check)
Log Group: /kosmos/tomcat/prod
fields @timestamp, @logStream, @message
| filter @message like /Picked up JDK_JAVA_OPTIONS|Server version|ERROR|SEVERE/
| sort @timestamp asc
| limit 200
クラス名で探す(com.kosmos)
Log Group: /kosmos/tomcat/prod
fields @timestamp, @logStream, @message
| filter @message like /com\.kosmos/
| sort @timestamp desc
| limit 50
API(URI・requestId 追跡)
直近の API 呼び出し(ENTER uri)を見る
Log Group: /kosmos/api/prod
fields @timestamp, @logStream, @message
| filter @message like /ENTER uri=/
| sort @timestamp desc
| limit 50
requestId で 1リクエストを追跡する
Log Group: /kosmos/api/prod
※ 1767711600372 を対象の requestId に置き換えてください。
fields @timestamp, @logStream, @message
| filter @message like /requestId=1767711600372/
| sort @timestamp asc
まず全体をざっと見る(最短チェック)
Log Group:(任意)
fields @timestamp, @message
| sort @timestamp desc
| limit 20
性能(遅い処理の傾向を見る)
遅い処理の傾向を見る(during=xxms 集計)
Log Group: /kosmos/api/prod
fields @timestamp, @message
| filter @message like /during=/
| parse @message "during=*ms" as duration
| stats max(duration) as maxMs, avg(duration) as avgMs
例外が発生しているか確認する
Log Group: /kosmos/tomcat/prod
fields @timestamp, @logStream, @message
| filter @message like /Exception|SEVERE|ERROR/
| sort @timestamp desc
| limit 20
※ 結果が表示されなければ、現在は例外は発生していない。