システム保守

APIサーバログ調査手順

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. まとめ

  1. Tomcatログで例外を見る
  2. APIログで URI を確認
  3. requestId と instanceId で紐付け
  4. 原因を特定する

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

※ 結果が表示されなければ、現在は例外は発生していない。

TOP